Différents cas d'exécution - C - Programmation
Marsh Posté le 12-11-2009 à 10:00:03
Citation : char *s1 = "OULA"; |
Exact. Edit: Voir réponse plus bas.
Citation : char s2[4] = "OULA"; |
Le comportement est indéterminé. printf("%s\n", s2) a besoin que s2 se termine par un zéro binaire. Il faudrait avoir ce zéro binaire dans l'un des quatre octets de la variable. Ce qui n'est pas le cas.
Le programme ne va pas ajouter le zéro binaire de lui-même. La fonction printf() ne vérifie pas la longueur des chaines de caractères. Elle ne va pas s'arrêter au quatrième caractère. Elle va aller jusqu'au premier zéro binaire trouvé. L'affichage dépendra du contenu de la pile (s2 est déclaré sur la pile) à l'instant où le programme est exécuté.
Mais la plupart des compilateurs modernes vont déctéter le problème avant qu'il ne se produise. Par exemple, "Initializer string is too long for array" est affiché quand j'essaye de compiler la ligne char s2[4] = "OULA"; avec le g++ de mingw. En effet "OULA" est en réalité une suite de cinq caractères : 'O', 'U', 'L', 'A', '\0'. Le compilateur voit bien que l'on ne peut pas faire rentrer 5 caractères dans s2[4].
Marsh Posté le 12-11-2009 à 10:11:33
Ok, je te remercie pour ta réponse, claire et précise!
Marsh Posté le 12-11-2009 à 10:58:20
olivthill a écrit :
Exact. |
Faux. Comportement indéfini (on ne peut pas modifier un littéral) et ca crash sur certaines implémentations que j'ai sous la main (gcc/Linux, xlc/AIX) qui mettent les littéraux en readonly.
Marsh Posté le 11-11-2009 à 18:56:59
Bonsoir,
Dans le programme ci-dessous, je cherche à savoir ce que donnent les 2 cas d'exécution:
Dans le premier cas, c'est-à-dire lorsqu'on rentre dans le if, je pense que le 0 de OULA dans la chaîne s1 devient un a, donc si on affichait s1 on aurait aULA.
Dans le second cas, c'est-à-dire lorsque le if n'est pas vérifié, on affiche seulement OUL étant donné qu'il fallait penser que la chaîne se termine par \0!
Est-ce correct?
Merci d'avance!
Message édité par dj_titeuf le 11-11-2009 à 19:01:03