Pb sur realloc

Pb sur realloc - C - Programmation

Marsh Posté le 05-10-2006 à 14:15:09    

Bonjour,
Voici un bout de code qui compile correctement mais qui bloque quand on le lance Memory Fault(coredump).


if(FD_ISSET(socket1,&set))
 {
 if((buffer_RX=(unsigned char*) calloc (LG_BUFFER,1*sizeof (unsigned char)))==NULL)
 printf("\nImpossible d'allouer la memoire buffer_RX pour socket1" );
  nb_lu=0;
  /*printf("\non passe le FDISSET de la socket" );*/
  while((nb_lu=read(socket1,buffer_RX,LG_BUFFER))>0)
  {
  /*break;*/
  printf("\nNb de carac lus sur socket %d N° caract %d",nb_lu,*buffer_RX);
  /*nb_lu=write(STDOUT_FILENO,buffer_RX,nb_lu);*/
  /*printf("\n Nb de crac ecris %d",nb_lu);*/
    if(buffer_RX[0]==255)
    {/*Un caractere IAC est arrive*/
    i=1;
    if((mess_nego=(unsigned char*) calloc (mess_nego,i*sizeof (unsigned char)))==NULL)
    printf("\nErreur sur attribution memoire mess_nego" );
    printf("\nConstruction du mess_nego" );
    flag_nego_option=1;
    i=++i;
    *mess_nego=*buffer_RX;
    /*free(buffer_RX);*/
    /*printf("\ncaractere de nego option %d qui est le carctere  -> %c -> 0x %02X -> %d\n",i,buffer_RX[0],(unsigned) buffer_RX[0],(unsigned) buffer_RX[0]);*/
    printf("\nvaleur de mess_nego %d, valeur de buffer_RX %d adresse mess_nego=%d buffer_RX=%d",*mess_nego,*buffer_RX,mess_nego,buffer_RX);
     while(flag_nego_option)
     {
     printf("\non est avant realloc valeur de i %d\n",i);
     [b]if((mess_nego=(unsigned char*)realloc(mess_nego,i*sizeof(unsigned char)))==NULL)[/b]     printf("\nErreur sur attribution memoire" );
     printf("\non passe la realloc de mess_nego[i] qui est a %d",*(mess_nego+i) );
     nb_lu=read(socket1,buffer_RX,LG_BUFFER);
     printf("\nvaleur de mess_nego[i] = %d valeur de i=%d",*(mess_nego+i),i);
      if(*(mess_nego+i)>=250 && *(mess_nego+i)<255)
      {
      printf("\non passe le if de *mess_nego" );
      /*OPTION_NEGOCIEE(mess_nego);*/
      }
     flag_nego_option==0;
     free(mess_nego);
     printf("\nle free(mes_nego) est ok\n" );
     i=++i;
     } /*fin de while(flag_nego_option)*/
    } /*fin de if(buffer_RX[0]==255)*/
    else  
    {
    write(STDOUT_FILENO,buffer_RX,nb_lu);
    printf("\non entre dans le else" );
    }
    free(buffer_RX);
    printf("\nle free(buffer_RX) est ok " );
    if((buffer_RX=(unsigned char*) calloc (LG_BUFFER,1*sizeof (unsigned char)))==NULL)
    printf("\nImpossible d'allouer la memoire buffer_RX dans while pour socket1" );
  }
  write(STDOUT_FILENO,buffer_RX,nb_lu);
  free(buffer_RX);
   
 }
 /*printf("\n" );*/
}


Le prog bloque au moment du realloc je n'arrive pas a comprendre ce qui ce passe.

Reply

Marsh Posté le 05-10-2006 à 14:15:09   

Reply

Marsh Posté le 05-10-2006 à 14:18:31    

Quelles sont les valeurs des variables en jeu à cette étape de l'éxecution ?
 
(et sinon y'a une balise CODE plutot que FIXED)


---------------
Töp of the plöp
Reply

Marsh Posté le 05-10-2006 à 14:31:57    

yartempion a écrit :

Bonjour,
Voici un bout de code qui compile correctement mais qui bloque quand on le lance Memory Fault(coredump).


 
Ca te dirait pas de nettoyer et aérer un peu le code pour qu'il soit, je sais pas, lisible ?
Non parce que là, j'ai dû effectuer une recherche pour trouver le realloc() [:petrus75]
 

i=++i;


 
Superbe.
"++i" suffisait :o
 
 
 
 

buffer_RX=(unsigned char*) calloc (LG_BUFFER,1*sizeof (unsigned char))


et

mess_nego=calloc (mess_nego,i*sizeof (unsigned char))


Regarde l'utilisation de calloc(), je crois que tu te méprends sur sa façon de fonctionner.
 
 

*mess_nego=*buffer_RX;


Pourquoi faire ?
 
En plus, free(mess_nego), sans mise à NULL, suivi de free(buffer_RX) va provoquer un coredump.
 
 
 
Et plein d'autres choses à corriger, notamment la logique de fonctionnement.
 
 
edit : j'ai perdu deux dixièmes à lire ton code


Message édité par Elmoricq le 05-10-2006 à 14:34:20
Reply

Marsh Posté le 05-10-2006 à 15:06:13    

1- Tu as entierement raison j'aurais du netoyer le code.
2- J'ai vraiment un coup de barre pour avoir ecris un code pareil avec calloc.
Mais je ne comprends pas pourquoi ca passe a la compile puisque c'est n'importe quoi mon truc.
Merci beaucoup pour le coup d'oeil et j'espere que tu rattraeras les deux dixiemes.

Reply

Marsh Posté le 06-10-2006 à 10:15:26    

yartempion a écrit :

Mais je ne comprends pas pourquoi ca passe a la compile puisque c'est n'importe quoi mon truc.


La compilation ne fait que vérifier la syntaxe du code plus la cohérence de la signature des fonctions avec le type des paramètres passés. A partir de là, si tu écris un truc illogique mais syntaxiquement correct, le compilo ne dira rien
Exemple: double *buf=malloc(-1 * sizeof(char)) => compilation ok (enfin ptet que "-1" il aimera pas mais "sizeof(char)" ça ne posera aucun problème)


Message édité par Sve@r le 06-10-2006 à 10:16:22

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

Marsh Posté le 09-10-2006 à 13:49:21    

Bonjour,
J'aifait de scorrectifs mais je perd la vleur de ma variable stockee dans mon pointeur
et au moment ou j'attribut le contenu d'un pointeur a un aiutre c'est l'adresse qui est donnee.
Voici le bout de code.

Code :
  1. if(FD_ISSET(socket1,&set))
  2. {/*Debut du if*/
  3.    if((buffer_RX=(unsigned char*) calloc (LG_BUFFER,sizeof (unsigned char)))==NULL)
  4.    printf("\nImpossible d'allouer la memoire buffer_RX pour socket1" );
  5. nb_lu=0;
  6. printf("\non passe le FDISSET de la socket" );
  7.    while((nb_lu=read(socket1,buffer_RX,LG_BUFFER))>0)
  8.    {/*Debut du    
  9.           if(buffer_RX[0]==255)
  10.           {/*Un caractere IAC est arrive*/
  11.           [b]printf("\nValeur de buffer_RX %d apres le if",*buffer_RX);  /*ici on a une valeur dans le pointeur*/[/b]       
  12.           i=1;
  13.           if((mess_nego=(unsigned char*) calloc (i,sizeof (unsigned char)))==NULL)
  14.           printf("\nErreur sur attribution memoire mess_nego" );
  15.           printf("\nReception de IAC Construction du mess_nego valeur de flag_nego_option %d IAC= %d",flag_nego_option,*buffer_RX);
  16.           flag_nego_option=1;
  17.           printf("\nValeur de buffer_RX %d",*buffer_RX);/*ici je perds la valeur de buffer_RX*/                 *mess_nego=*buffer_RX;
  18.           printf("\nValeur de buffer_RX %d",*buffer_RX);
  19.                while(flag_nego_option==1)
  20.      
  21.                {/*debut du while*/
  22.                printf("\non est avant realloc valeur de i %d et mess_nego = %d",i,*mess_nego);
  23.                if((mess_nego=realloc(mess_nego,(i+1)*sizeof(unsigned char)))==NULL)
  24.                printf("\nErreur sur attribution memoire" );
  25.                printf("\non passe la realloc de mess_nego[0] qui est a %d *mess_nego[i] est a %d et i est a %d",*(mess_nego),*(mess_nego+i),i);
  26.                nb_lu=read(socket1,mess_nego+i,LG_BUFFER);
  27.                printf("\non passe la read de mess_nego[0] qui est a %d *mess_nego[i] est a %d et i est a %d",*(mess_nego),*(mess_nego+i),i);
  28.                     if(*(mess_nego+i)>=250 && *(mess_nego+i)<255)
  29.      
  30.                     if{ /*Phase de test 250>=IAC<255*/
  31.                     ifprintf("\non passe le if de *mess_nego valeur *mess_nego+i = %d et *mess_nego = %d ",*(mess_nego+i),*(mess_nego));
  32.                     ifprintf("\non doit reallouer de la memoire et lire le caractere suivant" );
  33.                     if++i;
  34.                     ifprintf("\nvaleur de i %d",i);
  35.                     ifif((mess_nego=realloc(mess_nego,(i+1)*sizeof(unsigned char)))==NULL)
  36.                     ifprintf("\nErreur sur attribution memoire" );
  37.                     ifnb_lu=read(socket1,mess_nego+i,LG_BUFFER);
  38.                     ifprintf("\nnouveau mess_nego = ",*(mess_nego+i));
  39.                     iffor(j=0;j<=i;j++)
  40.                     ifprintf("\nfor %d j= %d",*(mess_nego+j),j);
  41.                     if/*OPTION_NEGOCIEE(mess_nego);*/
  42.                     if}
  43.      
  44.                  flag_nego_option=0;
  45.                  free(mess_nego);
  46.                  printf("\nle free(mes_nego) est ok valeur de l'adresse mess_nego %d\n",mess_nego);
  47.                  i=++i;
  48.                  } /*fin de while(flag_nego_option)*/
  49.      
  50.      } /*fin de if(buffer_RX[0]==255)*/
  51.    
  52.    
  53.      else
  54.      {/*Debut du else*/
  55.      write(STDOUT_FILENO,buffer_RX,nb_lu);
  56.      } /*Fin du else*/
  57.    
  58.    
  59.      free(buffer_RX);
  60.      }/*fin du while*/
  61.  
  62. }/*Fin du if*/
  63. }/*Fin du while 1*/


Je ne vois pas pourquoi je perds cette valeur.

Reply

Marsh Posté le 09-10-2006 à 13:54:47    

Entre la ligne 13 et la ligne 19 je perds la valeur de mo pointeur buffer_RX et quand je demande a ce que *mess_nego=*buffer_RX
c'est mess_nego qui pointe vers l'adresse de buffer_RX. Je ne comprends pas? Pb de parantheses ou quoi.
Merci.

Reply

Marsh Posté le 09-10-2006 à 14:57:55    

Ca y'est j'ai compris ce qui clochait, Je liberais trop vite la memoire du pointeur buffer_RX.
Merci A+

Reply

Sujets relatifs:

Leave a Replay

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