ansi c struct {avec tableau dynamic} affecté au tableau qui est realloc

pourquoi le code ci-dessous me donne l’erreur de “double libre ou corruption” … quand je comstack et exécute avec gcc [(Debian 4.4.4-8) 4.4.5 20100728 (version préliminaire)] Merci d’avance!

#include  #include  typedef struct { int *index1; } data; void doo(int *); int main(int argc, char *argv[]) { int *a = (int *) malloc(10*sizeof(int)); int i; for(i=0; i<10; i++) { a[i] = 2*i; } doo(a); data one; one.index1 = a; printf("%d\n", one.index1[4]); free(a); printf("%d\n", one.index1[4]); free(one.index1); return 0; } void doo(int *b) { b = (int *) realloc(b, 5*sizeof(int)); return; } 

 one.index1=a; ... free(a); ... free(one.index1); ... 

Ergo, le double libre.

 void doo(int *b) { b = (int *) realloc(b, 5*sizeof(int)); return; } 

Lorsque vous passez le pointeur a à cette fonction, sa valeur (qui consiste en une adresse) est copiée dans b, un autre pointeur int local. Désormais, lorsque vous réaffectez de l’espace à 5 ints, l’affectation de l’espace pour un effet est modifiée. Ainsi, votre espace est réduit de 10 à 5 ints.

Comme demandé par OP, pour obtenir les mêmes données et séparer les pointeurs de mémoire, vous devez allouer de l’espace au nouveau pointeur, puisqu’un pointeur n’est après tout qu’une variable contenant une adresse. Si vous affectez deux blocs distincts, vous obtiendrez deux adresses distinctes pouvant être libérées individuellement.

Parce que le stockage désigné par ‘a’ et ‘one.index1’ sont les mêmes (affectation avant la première impression). Ainsi, vous avez un double gratuit.

Vous passez à faire un pointeur. Vous modifiez le pointeur lui-même, mais votre fonction principale ne reçoit pas la nouvelle adresse.

Cela se produit parce que vous faites one.index1 et a point sur le même emplacement mémoire.

Pour tester cela, ajoutez ce qui suit à votre code:

  one.index1 = a; // from now on, both variables point to the same address printf("-> 0x%x\n", one.index1); printf("-> 0x%x\n", a); printf("%d\n", one.index1[4]); free(a); // release the resource pointed by a // You should not try to print the data of one.index1[4] since // that piece of memory doesn't exist no more. printf("%d\n", one.index1[4]); free(one.index1); // Problem: trying to free the same memory resource TWICE. 

Vous remarquerez que les deux pointeurs imprimeront les mêmes adresses de mémoire. Donc après free(a); est exécuté en effectuant free(one.index1); est redondant, et le problème est d’essayer de libérer une ressource qui n’est plus allouée.