Forum Clubic

[résolu]C , probleme avec realloc()

Bonjour ,
j’ai à l’execution d’un programme utilisant realloc une erreur à l’execution… le programme (très bête c’est juste un test, pour vous montrer) :


void test(){
  char*s=malloc(sizeof(char));
  int i=0;
  while(i<25){
      s=realloc(s,sizeof(char)*strlen("hello!\n"));
      strcat(s,"hello!\n");       // strcat(s1,s2) -> concatene s2 a la fin de s1, s1 est renvoyée
      i++;   //i++;
  }
  printf("%s\n",s);
}

voici l’erreur à l’execution :


*** glibc detected *** ./prg: realloc(): invalid pointer: 0x08049c7c ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(realloc+0x39c)[0xb7e829ec]
/lib/tls/i686/cmov/libc.so.6(realloc+0x3c)[0xb7e8268c]
./prg[0x80488b6]
./prg[0x8048a1d]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7e29450]
./prg[0x8048551]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:06 2007706    /home/user/C/prg
08049000-0804a000 rw-p 00000000 08:06 2007706    /home/user/C/prg
0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
b7e07000-b7e11000 r-xp 00000000 08:06 3694604    /lib/libgcc_s.so.1
b7e11000-b7e12000 rw-p 0000a000 08:06 3694604    /lib/libgcc_s.so.1
b7e12000-b7e13000 rw-p b7e12000 00:00 0 
b7e13000-b7f5c000 r-xp 00000000 08:06 3712011    /lib/tls/i686/cmov/libc-2.7.so
b7f5c000-b7f5d000 r--p 00149000 08:06 3712011    /lib/tls/i686/cmov/libc-2.7.so
b7f5d000-b7f5f000 rw-p 0014a000 08:06 3712011    /lib/tls/i686/cmov/libc-2.7.so
b7f5f000-b7f62000 rw-p b7f5f000 00:00 0 
b7f6e000-b7f70000 rw-p b7f6e000 00:00 0 
b7f70000-b7f71000 r-xp b7f70000 00:00 0          [vdso]
b7f71000-b7f8b000 r-xp 00000000 08:06 3694661    /lib/ld-2.7.so
b7f8b000-b7f8d000 rw-p 00019000 08:06 3694661    /lib/ld-2.7.so
bfd98000-bfdad000 rw-p bffeb000 00:00 0          [stack]
Abandon

Voila, je ne comprends pas donc si qqun s’est déjà trouvé devant ce problème peut-être aura-t-il une réponse.
Merci.

OK bon en fait cela a à voir avec la valeur du caractere ‘\n’
Désolé de ne pas y avoir penser avant de poster , vous pouvez supprimer.
merci
Edité le 09/11/2008 à 18:47

Je suis pas un expert en C, mais j’ai vite fait testé ton code.
Déjà, faire 25 realloc a la suite, c’est pas super ^^

Bon sinon, quand je remplaçais 25 par 5 (par exemple), je n’avais pas l’erreur.
Donc le code est a priori juste, mais a un moment, realloc renvoie la valeur NULL (d’où l’interet de mettre des tests …)

J’ai éditer le titre en mettant le tag “[résolu]”, la solution pourra intéresser d’autres personnes :jap:

A euh non ca ne peut absolument pas marcher :

Tu concatenne plusieurs fois “hello” à ta chaine en ne l’allouant qu’une seule fois. En gros lis le man de realloc www.cplusplus.com… :).

Ensuite tu ne prend pas en compte la caractère de terminaison.

Donc la solution :


void test(){
 char*s = NULL;
 int i=0;
 while(i<25)
{
 i++;
 s=realloc(s,sizeof(char) * strlen("hello!\n") * i + 1 ); // + 1 pour le caractère de teminaison.
 strcat(s,"hello!\n"); // strcat(s1,s2) -> concatene s2 a la fin de s1, s1 est renvoyée

 }
 printf("%s\n",s);
}

Non par contre, autant allouer définitivement sizeof(“hello!\n”) * 25 + 1 caractères hein :slight_smile: (sizeof = taille de la chaine sur une constante)

Bas disons que je pense que c’est un programme de test, pour utiliser realloc donc autant l’utiliser hein :).

De plus le “sizeof” retourne la taille de la chaine avec le ‘\0’ si je me souviens bien, donc tu alloues 25 caractere en trop :).
Edité le 10/11/2008 à 19:19

Peu importe, tu peux aussi faire un savant calcul dans le pire des cas :slight_smile: