c realloc(): invalid next size
bekomme ich diesen Fehler und die online-Suche noch nicht gelöst so, hier ist mein code^^:
void addSoggetto(char* s)
{
soggetti_length++;
if(realloc(soggetti, soggetti_length*sizeof(int))==NULL)
{
printf("Realloc Failed");
return;
}
Grundsätzlich habe ich ein array von Zeigern (soggetti
) und seine Länge (soggetti_length
).
Jedes mal, wenn diese Funktion ran, ich realloc die Größe, um Platz für einen anderen Zeiger.
Problem sein, genau zum fünften mal die Funktion aufgerufen wird, bekomme ich:
realloc(): invalid next size
Wissen Sie, wie kann ich tun?
Ich denke, ich kann ausschließen, dass die Erinnerung, die ich realloc ist nicht enaugh, Band ich ihn zu verstärken und es ändert sich nichts.
Oh, und ich Debuggen mit gdb, die Funktion stürzt ab, VOR der Rückkehr, so dass ich nicht sogar so etwas wie eine NULL-Rendite
- Eine kompilierbare Beispiel würde helfen. Deins schlägt fehl, Sie deklarieren die Variablen, die Sie verwendet und enthält mehr
{
als}
. - int und Zeiger 32 bit, aber ja du hast Recht, es ist besser...aber wie gesagt, das ist nicht die Lösung, auch wenn ich allozieren mit 100 bytes zu speichern, 4 von Ihnen, der Fehler ist der gleiche
- sorry pascal, aber der code ist aufgeteilt in mehrere Dateien, und der wichtige Teil ist, dass man...im zweiten Teil die Funktion, die ich zuordnen eines Objekts und speichert seine Zeiger in die Position, die ich nur umgeschichtet und auf das array
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen Sie die manpage für
realloc()
.realloc()
gibt einen Zeiger auf die neue Zuordnung, es ändert sich nicht die alten Zeiger als argument übergeben. (Es kann nicht, weil C verwendet, durch Wert übergeben, nicht pass-by-reference). Also dieist ein memory leak (und falsch). Man braucht so etwas wie:
aber in diesem Fall eine Zuteilung der Ausfall auch ein Speicherleck. Also, um sicher zu sein, die Sie tun können:
Mit dem rest des Codes, können wir sehen, das andere problem:
Haben Sie zugewiesen eine
int
im Wert von Speicher (sizeof(int)
) prosogetto_length
, aber Sie speichern eine 64-bit -Sogetto *
. Diese thrashes den heap durch überschreiben der zugehörigen Metadaten im Speicher (daher derinvalid next size
, diesize
Teil einer heap-Datenstruktur überschrieben wurde).Schreiben
Dies richtig verarbeiten.
Sie zu finden, wie Fehler, die ich empfehlen würde
valgrind
,address sanitizer
.sogetti_length
? Eine Globale variable? Könnte Sie veröffentlichen die modifizierte code, einschließlich aller relevanten Deklarationen von Variablen?Ok, das ist der geänderte code, gleiche Fehler wie zuvor bei der fünften Aufruf von realloc:
*soggetti_length ist die Globale variable, welche die Länge des Arrays
int
s, aber schreibenSogetto *
s. Auf einem 64-bit system in eine 64-bit-Prozess, Zeiger 64 bit.