realloc (): Ungültige nächste Größe beim Neuzuweisen, um Platz für strcat in char * zu schaffen

8

Ich erhalte einen ungültigen Speicherfehler beim folgenden Code:

%Vor%

Ausgabe:

  

FINE 5
FINE 6 LÄNGE IST: 2
* glibc erkannt * ./auto: realloc (): ungültig nächste Größe: 0x08cd72e0 ***   ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x6dd591]

Der hier zu beachtende Punkt ist Fine 7 wird nie gedruckt. und der ungültige Fehler der nächsten Größe bei jedem Lauf befindet sich am selben Ort.

Gefunden dies relavent

    
PUG 08.12.2011, 20:01
quelle

3 Antworten

6

Dieser Fehler tritt auf, weil ein anderer Teil Ihres Codes den Heap beschädigt hat. Wir können Ihnen nicht sagen, um welchen Fehler es sich handelt, ohne den Rest des Codes zu sehen.

Die Tatsache, dass FINE 7 nicht gedruckt wird, sagt Ihnen, dass realloc fehlschlägt. Und dieser Fehler muss darauf zurückzuführen sein, dass buffer wegen einer früheren Heap-Beschädigung in der Ausführung ungültig ist.

Orthogonal zu Ihrem tatsächlichen Problem, sizeof(char) ist 1 per Definition, daher ist es sinnvoll, es aus dem Code zu entfernen.

    
David Heffernan 08.12.2011, 20:10
quelle
6

David Heffernan weist darauf hin, dass Ihr Root-Problem an anderer Stelle in Ihrem Code ein wilder Zeiger sein muss, der den Heap zerschlägt.

Es gibt jedoch noch einige andere Dinge, über die man in diesem Code-Snippit nachdenken sollte:

  1. Keine Notwendigkeit für sizeof (char) im neuen Größenausdruck, da sizeof (char) per Definition 1 ist.

  2. Weisen Sie die Rückgabe von realloc niemals direkt dem einzigen Zeiger auf den Puffer zu, den Sie neu zuweisen. Wenn realloc bei einem Fehler NULL zurückgibt, verlieren Sie den Zeiger auf den alten Puffer und erhalten Ihren eigenen Speicherverlust. Sie möchten immer das entsprechende Äquivalent von:

    machen %Vor%
  3. In v wird void * bei der Zuweisung automatisch in den richtigen Typ konvertiert. Es ist nicht notwendig, zu casten. Darüber hinaus erhalten Sie in einigen Fällen keine sinnvollen Fehlermeldungen, wenn Sie vergessen, die Deklaration der Funktion in Frage zu stellen.

  4. String-Literale enthalten einen impliziten Null-Terminator. Du wolltest sagen:

    strcat (Puffer, ":");

Auf der oberen Seite wird strcat beim ersten Null-Zeichen anhalten, also in diesem Fall kein Schaden.

    
Greg Jandl 08.12.2011 20:11
quelle
0

(char *)realloc(buffer, strlen(buffer)* sizeof(char) + (strlen(": ")+1)* sizeof(char));

Sollte

sein

(char *)realloc(buffer, (strlen(buffer) + strlen(": ") + 1) * sizeof(char));

sollte es nicht? Sie sind Mathe für die Länge der Zeichenfolge ist falsch.

    
Grambot 08.12.2011 20:12
quelle

Tags und Links