free(): invalid next size
-
Hallo!
Das Programm compiliert, funktioniert aber nicht wie erwartet.int node_add(t_unv_node node) /* ************************************************** ***************** */ /* Routine fuegt neuen Knoten an Knotenliste an ---------------------- */ /* node : neuer Knoten -------------------------------------------- */ { /* Allozieren des Speichers fuer ein neues Listenelement ------------- */ printf("\n basis_data_func.c : node_add1, new_anz_node =%d",new_anz_node);//Hinzugefuegt von A.L. if ((new_unv_node = (t_unv_node*) realloc(new_unv_node, sizeof(t_unv_node) * (new_anz_node + 1))) ==NULL) return(-1); /* Fehler: nicht genuegend Speicher -------------- */ memcpy((char *)(&new_unv_node[new_anz_node]), (char *)&node, sizeof(t_unv_node)); new_anz_node += 1; return(0); /* ************************************************** ***************** */ }
Die obere Methode wird einmal durchgelaufen, beim zweiten mal aber kommt das Untere heraus.
basis_data_func.c : node_add1, new_anz_node =0
*** glibc detected *** ./shellcast_gcc: free(): invalid next size (normal): 0x080988b0 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7db26e1]
/lib/libc.so.6[0xb7db53b2]
/lib/libc.so.6(realloc+0xff)[0xb7db656f]
./shellcast_gcc[0x806bc8e]
./shellcast_gcc[0x8058abf]
./shellcast_gcc[0x805c91d]
./shellcast_gcc[0x8065191]
./shellcast_gcc[0x80509a7]
./shellcast_gcc(__gxx_personality_v0+0x2c3)[0x80494ff]
/lib/libc.so.6(__libc_start_main+0xdc)[0xb7d63f9c]
./shellcast_gcc(__gxx_personality_v0+0x75)[0x80492b1]
======= Memory map: ========
08048000-08076000 r-xp 00000000 03:08 949392 /home/alex/Desktop/ASG_1/bin/shellcast_gcc
08076000-08077000 r--p 0002d000 03:08 949392 /home/alex/Desktop/ASG_1/bin/shellcast_gcc
08077000-08078000 rw-p 0002e000 03:08 949392 /home/alex/Desktop/ASG_1/bin/shellcast_gcc
08078000-080cc000 rw-p 08078000 00:00 0 [heap]
b7900000-b7921000 rw-p b7900000 00:00 0
b7921000-b7a00000 ---p b7921000 00:00 0
b7a3f000-b7d4e000 rw-p b7a3f000 00:00 0
b7d4e000-b7e76000 r-xp 00000000 03:08 2698099 /lib/libc-2.5.so
b7e76000-b7e77000 r--p 00128000 03:08 2698099 /lib/libc-2.5.so
b7e77000-b7e79000 rw-p 00129000 03:08 2698099 /lib/libc-2.5.so
b7e79000-b7e7c000 rw-p b7e79000 00:00 0
b7e7c000-b7e86000 r-xp 00000000 03:08 2698143 /lib/libgcc_s.so.1
b7e86000-b7e88000 rw-p 00009000 03:08 2698143 /lib/libgcc_s.so.1
b7e88000-b7eac000 r-xp 00000000 03:08 2698107 /lib/libm-2.5.so
b7eac000-b7eae000 rw-p 00023000 03:08 2698107 /lib/libm-2.5.so
b7eae000-b7f87000 r-xp 00000000 03:08 2032012 /usr/lib/libstdc++.so.6.0.8
b7f87000-b7f8a000 r--p 000d9000 03:08 2032012 /usr/lib/libstdc++.so.6.0.8
b7f8a000-b7f8c000 rw-p 000dc000 03:08 2032012 /usr/lib/libstdc++.so.6.0.8
b7f8c000-b7f93000 rw-p b7f8c000 00:00 0
b7fba000-b7fbd000 rw-p b7fba000 00:00 0
b7fbd000-b7fbe000 r-xp b7fbd000 00:00 0 [vdso]
b7fbe000-b7fd9000 r-xp 00000000 03:08 2698092 /lib/ld-2.5.so
b7fd9000-b7fdb000 rw-p 0001a000 03:08 2698092 /lib/ld-2.5.so
bf837000-bf89e000 rw-p bf837000 00:00 0 [stack]
basis_data_func.c : node_add1, new_anz_node =1AbgebrochenWoran liegt das? Bitte um Hilfe!
-
Du hast dir irgendwo zwischen den beiden Aufrufen den Heap zerstört (vermutlich ein falscher Index-Zugriff). Btw, wo sind eigentlich new_unv_node und new_anz_node her?
PS: den Rückgabewert von realloc() casten nur C++ Programmierer - und die würden eher einen std::vector<> verwenden anstelle der manuellen Speicherkontrolle.
-
CStoll schrieb:
PS: den Rückgabewert von realloc() casten nur C++ Programmierer -
nicht nur das, Memory Leaks sind dabei möglich, weil wenn realloc NULL zurückliefert, dann verliert man einen Pointer (oder mehr sogar, falls dies eine Liste ist).
/* wie rufe ich realloc auf? */ datatype *ptr = malloc(...); ... datatype *tmp; tmp = realloc(ptr, new_size); if(tmp == NULL) { /* ptr bleibt intakt und geht nicht verloren */ ... } ptr = tmp;
Keine Ahnung, wie t_unv_node definiert ist, aber wenn du über die Funktion den Inhalt des Pointers ändern willst, dann muss man einen Pointer auf den Pointer übergeben, ergo
int node_add(t_unv_node *node) t_unv_node tmp; printf("\n basis_data_func.c : node_add1, new_anz_node =%d",new_anz_node); tmp = realloc(*node, sizeof(t_unv_node) * (new_anz_node + 1)); if(tmp == NULL) /* Fehler, node bleibt aber intakt */ return -1; *node = tmp; /* dein memcpy verstehe ich nicht, ich seh dort das eigentliche Problem */ new_anz_node += 1; return 0; }
CStolls Fragen "Btw, wo sind eigentlich new_unv_node und new_anz_node her?" würde ich an dieser Stelle auch stellen.