Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1713 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Différents cas d'exécution

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Différents cas d'exécution

n°1939740
dj_titeuf
Posté le 11-11-2009 à 18:56:59  profilanswer
 

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
mood
Publicité
Posté le 11-11-2009 à 18:56:59  profilanswer
 

n°1939866
olivthill
Posté le 12-11-2009 à 10:00:03  profilanswer
 

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
n°1939874
dj_titeuf
Posté le 12-11-2009 à 10:11:33  profilanswer
 

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


Message édité par dj_titeuf le 12-11-2009 à 10:11:48
n°1939903
Un Program​meur
Posté le 12-11-2009 à 10:58:20  profilanswer
 

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)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Différents cas d'exécution

 

Sujets relatifs
[Ruby] exécution d'une commande 'echo' avec ruby [résolu]lancer une execution d'un programme a paritr d'une interface java
Différents pb PHP/MySQL[RESOLU] Sous Eclipse l'exécution marche bien mais pas avec la comm
[RESOLU] Lors de l'éxecution un coup ca marche, un coup ca marche pasPb execution de requete sur site en php
Exécution incomplète du programme.[awk] Extraire et additionner différents élements d'un fichier
programmer l'exécution de requêtes (mysql)vitesse d'éxecution sur différents ordinateurs (Résolu)
Plus de sujets relatifs à : Différents cas d'exécution


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR