ansi c struct {con el arreglo dynamic} asignado al arreglo que es realloc

por qué el siguiente código me da un error de “doble libertad o corrupción” … cuando compilo y ejecuto con gcc [(Debian 4.4.4-8) 4.4.5 20100728 (versión preliminar)]. ¡Gracias por adelantado!

#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, el doble gratis.

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

Cuando pasa el puntero a a esta función, su valor (que es una dirección de hecho), se copia en b, otro puntero int local. Ahora, cuando reasigna espacio para 5 ints, cambia la asignación de espacio para un hecho. Así tu espacio se reduce de 10 a 5 pulgadas.

Según lo solicitado por OP, para obtener los mismos datos y punteros de memoria separados, el espacio debe asignarse de nuevo para el nuevo puntero, ya que un puntero es, después de todo, solo una variable, con una dirección. Si asigna dos bloques separados, obtendrá dos direcciones separadas, que se pueden liberar individualmente.

Porque el almacenamiento apuntado por ‘a’ y ‘one.index1’ son los mismos (asignación antes de la primera impresión). Así tienes un doble gratis.

Estás pasando a hacer un puntero. Modifica el puntero en sí, pero su función principal no obtiene la nueva dirección.

Eso sucede porque one.index1 y a punto a la misma ubicación de memoria.

Para probar esto agregue lo siguiente a su código:

  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. 

Notarás que ambos punteros imprimirán las mismas direcciones de memoria. Así que después de free(a); Se ejecuta, realizando free(one.index1); es redundante, y tratar de liberar un recurso que ya no está asignado es lo que causa el problema.