memcmp ??

memcmp ?? - C - Programmation

Marsh Posté le 26-01-2004 à 15:30:09    

Code :
  1. typedef struct
  2. {
  3.    char str[50];
  4.    int type;
  5. }CI,*RefCI;


 
pourquoi les deux codes suivants ne sont pas identiques.
Dans le premier code, la fonction memcmp renvoie bien 0.Mais pas dans le deuxième code.why ???
 
code 1:  
 

Code :
  1. int main(int argc,char** argv)
  2. {
  3. RefCI c;
  4. RefCI cc;
  5. c=(RefCI)malloc(sizeof(CI));
  6. strcpy(c->str,"tintin" );
  7. c->type=3;
  8. cc=(RefCI)malloc(sizeof(CI));
  9. strcpy(cc->str,"tintin" );
  10. cc->type=3;
  11. if(!memcmp((RefCI)c,(RefCI)cc,sizeof(CI)))
  12.  printf("Egale\n" );
  13. else
  14.  printf("Different\n" );
  15.    
  16. free(cc);
  17. free(c);
  18. return 0;
  19. }


 
code 2: ( à priori équivalent)
 

Code :
  1. int main(int argc,char** argv)
  2. {
  3. CI c;
  4. RefCI cc;
  5. strcpy(c.str,"chaine bidon" );
  6. c.type=3;
  7. cc=(RefCI)malloc(sizeof(CI));
  8. strcpy(cc->str,"chaine bidon" );
  9. cc->type=3;
  10. if(!memcmp((RefCI)&c,(RefCI)cc,sizeof(CI)))
  11.  printf("Egale\n" );
  12. else
  13.  printf("Different\n" );
  14.    
  15. free(cc);
  16. return 0;
  17. }


 
 :??:

Reply

Marsh Posté le 26-01-2004 à 15:30:09   

Reply

Marsh Posté le 26-01-2004 à 15:47:11    

:sarcastic:
 
Tu as verifié si la mémoire que tu lisais avec memcmp est initialisée correctement ? Si tu est sous Linux, essaye de passer ton code à Valgrind tu veras, tu aprendras plein de choses.


Message édité par Kristoph le 26-01-2004 à 15:49:14
Reply

Marsh Posté le 26-01-2004 à 15:59:23    

Un petit coup de dump memory montre tout de suite pourquoi la comparaison n'est pas la meme: apres tes allocations memoires, il y a n'importe quoi dans les chaines allouées, tant que tu n'as pas fait le strcpy, et ensuite, il y a n'importe quoi entre le \0 de fin de chaine et le dernier octet du tableau non rempli.
 
A priori, les 2 tests pourraient donc repondre different. Si ca le fait pas au premier (et la fait au second), c'est que tu es probablement an mode debug, et que ton allocateur memoire doit remplir ce que tu alloues avec une chaine caracteristique, pour verifier des pbs de depassement... Tu utilises le meme allocateur ==> meme octet de remplissage. C'est pas le cas dans le second cas.
Mais a la base, si le premier test repond Egal, c'est a cause d'un effet de bord, donc.
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Marsh Posté le 26-01-2004 à 16:04:08    

bref joue également avec memset et calloc

Reply

Marsh Posté le 26-01-2004 à 16:22:49    

J'ai l'impression qu'il cherche en fait a faire l'analogue pour l'operateur de comparaison du deep_copy pour l'opérateur de copie...
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Marsh Posté le 26-01-2004 à 17:57:55    

gilou a écrit :

Un petit coup de dump memory montre tout de suite pourquoi la comparaison n'est pas la meme: apres tes allocations memoires, il y a n'importe quoi dans les chaines allouées, tant que tu n'as pas fait le strcpy, et ensuite, il y a n'importe quoi entre le \0 de fin de chaine et le dernier octet du tableau non rempli.
 
A priori, les 2 tests pourraient donc repondre different. Si ca le fait pas au premier (et la fait au second), c'est que tu es probablement an mode debug, et que ton allocateur memoire doit remplir ce que tu alloues avec une chaine caracteristique, pour verifier des pbs de depassement... Tu utilises le meme allocateur ==> meme octet de remplissage. C'est pas le cas dans le second cas.
Mais a la base, si le premier test repond Egal, c'est a cause d'un effet de bord, donc.
A+,


 
 
arff oui, bien vu. merci monsieur  :jap:

Reply

Marsh Posté le 26-01-2004 à 18:03:54    

Taz a écrit :

bref joue également avec memset et calloc


 
yes  ;)

Reply

Sujets relatifs:

Leave a Replay

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