problemme sur realloc

problemme sur realloc - C - Programmation

Marsh Posté le 27-09-2009 à 11:11:37    

Bonjour,
Voici un bout de code:

Code :
  1. int Ident_Modif(pos_mem3,ProxyId2,FluxId2)
  2. {
  3. char *Modification,*temp_Modification,*Modif;
  4. int resultat3, Ident_ACL;
  5. printf("\nRecherche type modif pos_mem3" );
  6. sleep(2);
  7.  
  8. if((Modification=(char*)calloc (13,sizeof(char*)))==NULL)  
  9.  {
  10.  perror("\nErreur sur allocation de memoire tampon" );
  11.  exit(4);
  12.  }
  13. else
  14. memset(*Modification,0,strlen(Modification));
  15. printf("\navant la boucle" );
  16. do
  17. {
  18.  if((resultat3=fread(Modification,sizeof (char),12,Instructions))<12)
  19.  perror("\nErreur de lecture de l'opération du flux a traiter" );
  20.  pos_mem3++;
  21.  fseek(Instructions,pos_mem3,SEEK_SET);
  22. }while((strcmp(Modification,"modification" )));
  23.  
  24. printf("\nType de Modification : %s",Modification);
  25. pos_mem3=pos_mem3+strlen(Modification);
  26. /*fseek(Instructions,pos_mem3+strlen(Modification),SEEK_SET);*/
  27. printf("\nAprés le fseek" );
  28. if((Modification=(char*)calloc (2,sizeof(char*)))==NULL)  
  29.  {
  30.  perror("\nErreur sur allocation de memoire tampon" );
  31.  exit(4);
  32.  }
  33. else memset(*Modification,0,strlen(Modification));
  34. printf("\ntoujours ok" );
  35.  if((temp_Modification=(char*)calloc (2,sizeof(char*)))==NULL)  
  36.  {
  37.  perror("\nErreur sur allocation de temp_Modification" );
  38.  exit(4);
  39.  }
  40. else memset(*temp_Modification,0,strlen(Modification));
  41. if((Modif=(char*)calloc (2,sizeof(char*)))==NULL)  
  42.  {
  43.  perror("\nErreur sur allocation de Modif" );
  44.  exit(4);
  45.  }
  46. memset(*Modif,0,strlen(Modif));
  47. printf("\ntoujours ok" );
  48. do
  49. {
  50. fseek(Instructions,pos_mem3,SEEK_SET);
  51.   /*printf("\ndans la boucle do" );*/
  52. if((resultat3=fread(Modif,1,sizeof(char),Instructions))<1)
  53.  perror("\nErreur de lecture du type de modif" );
  54.  printf("\napres le read valeur %c %d",*Modif,*Modif);
  55.  if(isalpha(*Modif))
  56.  {
  57.  printf("\ndans le if" );
  58.  strcat(Modification,Modif);
  59.   printf("\napres le strcat valeur Modif %c Modification %s taille Modification %d",*Modif,*Modification,strlen(Modification));
  60.   if(temp_Modification=realloc(Modification,(strlen(Modification)+10)*sizeof(char))==NULL)
  61.   perror("\nErreur sur reallocation memoire Modification" );
  62.   printf("\napres realloc taille %d %d",strlen(Modification),strlen(temp_Modification));
  63.   if(Modification=realloc(temp_Modification,(strlen(temp_Modification)+1)*sizeof(char))==NULL)
  64.   perror("\nErreur sur reallocation memoire Modification" );
  65.   printf("\napres passage taille %d %d",strlen(Modification),strlen(temp_Modification));
  66.  }
  67.  pos_mem3++;
  68.  printf("\nreboclage Modification = %s Modif= %d pos_mem3 %d\n",*Modification,*Modif,pos_mem3);
  69.  sleep(2);
  70. }while(*Modif!=10);
  71.  printf("\noperation: %s\n",*Modification);
  72.  free(Modification);
  73.  free(temp_Modification);
  74.  free(Modif);
  75. return(pos_mem3+strlen(Modification));
  76. }

 

et voici le resultat avant la creation du fichier core:

 

Recherche type modif pos_mem3
avant la boucle
Type de Modification : modification
Aprés le fseek
toujours ok
toujours ok
apres le read valeur : 58
reboclage Modification =  Modif= 58 pos_mem3 143

 

apres le read valeur   32
reboclage Modification =  Modif= 32 pos_mem3 144

 

apres le read valeur s 115
dans le if
apres le strcat valeur Modif s Modification  taille Modification 1
apres realloc taille 1 0
apres passage taille 0 0
reboclage Modification =  Modif= 115 pos_mem3 145

 

apres le read valeur u 117
dans le ifBus error(coredump)

 

Pourquoi la fonction realloc ne recopie t'elle pas le contenu d une memoire a l'autre?
Merci

Message cité 1 fois
Message édité par gilou le 27-09-2009 à 19:00:12
Reply

Marsh Posté le 27-09-2009 à 11:11:37   

Reply

Marsh Posté le 27-09-2009 à 23:06:54    

yartempion a écrit :

Bonjour,
Voici un bout de code:

Code :
  1. int Ident_Modif(pos_mem3,ProxyId2,FluxId2)
  2. {
  3. char *Modification,*temp_Modification,*Modif;
  4. int resultat3, Ident_ACL;
  5. printf("\nRecherche type modif pos_mem3" );
  6. sleep(2);
  7.  
  8. if((Modification=(char*)calloc (13,sizeof(char*)))==NULL)  
  9.  {
  10.  perror("\nErreur sur allocation de memoire tampon" );
  11.  exit(4);
  12.  }
  13. else
  14. memset(*Modification,0,strlen(Modification));



Je ne vais même pas plus loin. Tu alloues 13 pointeurs dans une zone prévue pour recevoir des caractères. Et en plus tu utilises strlen() sur une zone qui n'est pas forcément une chaine (même si ça ne gêne pas trop puisque le calloc l'a remplie de zéros). D'ailleurs, le memset est inutile puisque justement calloc a rempli ta zone de zéros.
 
Avec ça, inutile de réfléchir sur les autres problèmes de ton code (dont realloc fait partie).


Message édité par Sve@r le 27-09-2009 à 23:08:11

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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