2016-10-03 1 views
-5

OK pour Linux 32/64 Windows 32/64 compilé avec GCC, DOS et OS2 avec compilateur MS sur Mac OS o BSD compilé avec GCC, aller à la boucle infinieManipulation de chaînes en C, syntaxiquement correcte, mais ne fonctionne pas avec MacOS ou freeBSD

char *b,p[]={'0','1','2','3','4','5','6','7','8','9','\0'}; 
for (b=p;(*(b++)=*b);); 
printf("p=%s\n",p); 

// result: 
// 123456789 

// Test for MacOS or BSD 
unsigned char Test=0x0F; 
for (b=p;((*(b++)=*b) && --Test);); 
if (!Test) printf("Error\n"); 


// OK for Mac OS or FreeBSD 
for (b=p;(*b);b++) *b=*(b+1); 
printf("p=%s\n",p); 

// result: 
// 123456789 

ok, maintenant il fonctionne, mais la question reste, pourquoi il ne fonctionne pas si la syntaxe est correcte?

+2

= logique. Et s'il vous plaît, clarifiez ce que le programme est censé faire, quel est le résultat attendu et quelle est la production réelle. "ça marche" et "ça ne marche pas" n'est pas exactement descriptif. – kaylum

+0

fait partie d'un routines de traitement de chaîne, les routines fonctionne parfaitement, correctement testé sur différents systèmes d'exploitation, Ubuntu 32bit, Mint 64, Windows XP, Seven 64 bits ainsi que pour pure fantaisie de DOS et OS2. comme en témoigne BDS comme boucle sans fin, vérifié en insérant un compteur pour forcer la sortie. – Blindonet

+0

Pour le code C en particulier, il peut y avoir un écart ** BIG ** entre "syntaxiquement correct" et "ça marche". Quelque chose comme 'printf (" 2 + 2 = 5 ");' est parfaitement bonne syntaxe. –

Répondre

6

Le problème est que cette expression est non séquencée:

*(b++)=*b 

Essentiellement, la valeur en cours de modification est accessible à plus d'une fois sans point de séquence entre les deux. Cela signifie que le comportement est indéfini.

Votre autre expression est libre de comportement non défini, car la modification se produit dans l'en-tête de la boucle:

*b=*(b+1) 
syntaxe
+0

exactement, en fait je suis entré dans la correction, mais je voudrais comprendre pourquoi. – Blindonet

+0

@Blindonet La raison pour laquelle la norme requiert un point de séquence est qu'elle veut donner aux fabricants de compilateurs le choix du moment où l'effet de '++' doit être appliqué. Il peut être appliqué avant l'affectation ou après l'assignation, ce qui fera que votre programme fonctionnera comme vous le souhaitez ou le casse. – dasblinkenlight