Différents cas d'exécution

Différents cas d'exécution - C - Programmation

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:
 

Code :
  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4.     char *s1 = "OULA";
  5.     char s2[4] = "OULA";
  6.     if (atoi(argv[1])==1) {
  7.         s1[0]='a';
  8.     }
  9.     else {
  10.         printf("%s\n", s2);
  11.     }
  12.     return 0;
  13. }


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
Reply

Marsh Posté le 11-11-2009 à 18:56:59   

Reply

Marsh Posté le 12-11-2009 à 10:00:03    

Citation :

char *s1 = "OULA";
s1[0]='a';
le 0 de OULA dans la chaîne s1 devient un a

Exact. Edit: Voir réponse plus bas.
 

Citation :

char s2[4] = "OULA";
printf("%s\n", s2);
on affiche seulement OUL étant donné qu'il fallait penser que la chaîne se termine par \0!

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].

Message cité 1 fois
Message édité par olivthill le 12-11-2009 à 11:20:04
Reply

Marsh Posté le 12-11-2009 à 10:11:33    

Ok, je te remercie pour ta réponse, claire et précise! :)


Message édité par dj_titeuf le 12-11-2009 à 10:11:48
Reply

Marsh Posté le 12-11-2009 à 10:58:20    

olivthill a écrit :

Citation :

char *s1 = "OULA";
s1[0]='a';
le 0 de OULA dans la chaîne s1 devient un a

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.
 


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed