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

  FORUM HardWare.fr
  Programmation
  C

  Pb sur realloc

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb sur realloc

n°1452784
yartempion
Posté le 05-10-2006 à 14:15:09  profilanswer
 

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.

mood
Publicité
Posté le 05-10-2006 à 14:15:09  profilanswer
 

n°1452788
_darkalt3_
Proctopathe
Posté le 05-10-2006 à 14:18:31  profilanswer
 

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
n°1452803
Elmoricq
Modérateur
Posté le 05-10-2006 à 14:31:57  profilanswer
 

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
n°1452830
yartempion
Posté le 05-10-2006 à 15:06:13  profilanswer
 

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.

n°1453223
Sve@r
Posté le 06-10-2006 à 10:15:26  profilanswer
 

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.
n°1454251
yartempion
Posté le 09-10-2006 à 13:49:21  profilanswer
 

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.

n°1454257
yartempion
Posté le 09-10-2006 à 13:54:47  profilanswer
 

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.

n°1454343
yartempion
Posté le 09-10-2006 à 14:57:55  profilanswer
 

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


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

  Pb sur realloc

 

Sujets relatifs
realloc d'un tableau plus petitProbleme étrange avec realloc ...
aide sur le reallocPb de realloc et warning lors de la compilation
question sur realloc ..equivalant de realloc en C++
[Fixed!][HTML] (Form) 'action' avec variables en GET ? (Pb)Realloc() après un free()
Petit probleme de compréhension avec realloc... 
Plus de sujets relatifs à : Pb sur realloc


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)