retour de valeur bizarre

retour de valeur bizarre - C - Programmation

Marsh Posté le 07-02-2015 à 01:59:47    

bonsoir,
 
je testais un truc sur ce code
 

Code :
  1. # include <stdio.h>
  2. int main ()
  3. {
  4. int test = 1;
  5.     char nombre [] = "a,a,a,a,a,a,a,a,a";
  6. printf("votre mot svp ? :\n" );
  7. scanf ("%s",nombre);
  8. printf("bonjour votre mot est %s et j'affiche le nomre %d \n",nombre,test);
  9. system("pause" );
  10. return;
  11. }


 
quand je rentre le mot tomate printf me retourne bien 1 par contre quand je rentre tomaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaate printf me retourne 1952538977 ??? quelqu'un aurait t'il une explication ?
 
thanks

Reply

Marsh Posté le 07-02-2015 à 01:59:47   

Reply

Marsh Posté le 07-02-2015 à 04:41:37    

A mon avis, la raison est trop peu d'espace est alloué au mot nombre.
 
Si tu fait :

Code :
  1. char *nombre[1024];


 
T'as plus de chance d'y mettre une grande tomate.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 07-02-2015 à 10:40:19    

> char nombre [] = "a,a,a,a,a,a,a,a,a";
17 caractères plus le \0 final => nombre a une taille de 18, et une taille mémoire de 18 lui est réservée
> printf("votre mot svp ? :\n" );
> scanf ("%s",nombre);
Maintenant, on change le contenu de nombre par celui de la chaîne tapée en entrée. Si celle ci (en comptant le \0 final) dépasse les 18 caractères, ça déborde et écrit n'importe ou en zone mémoire, par exemple, sur la zone réservée à stocker la valeur de test.
Le compilateur n'a pas de moyen de vérifier que ce qui va être entré va être de la bonne taille, mais à l'exécution, il pourrait y avoir des options de compilation qui font planter le programme dès que celui ci essaye d'écrire une valeur de variable en dehors de la zone mémoire qui lui a été réservée.
 
> char *nombre[1024];
Non! c'est char nombre[1024]; que vous vouliez taper je suppose.
 
A+,


Message édité par gilou le 07-02-2015 à 10:46:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-02-2015 à 11:24:32    

Ah les joies de la gestion mémoire du C :)

Reply

Marsh Posté le 13-02-2015 à 20:09:15    

ouai, effectivement il y a eu un overflow, au début j'avais pas compris mais en ce moment je regarde les vidéos youtube de richard juan sur l'assembleur et tous s'explique. Adressage mémoire, byte word dword etc...
Avec l'assembleur tous deviens plus claire, les langage de haut niveau nous empêches de comprendre certaine subtilités (sauf le C peut être)

Reply

Sujets relatifs:

Leave a Replay

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