2016-05-05 16 views
1

Ich habe ein Problem mit C, dieser Code werfen Stack-Dump. Ich habe keine Ahnung, was falsch ist.Verwendung von Realloc auf einem zuvor malloc-ed-Zeiger verursacht Segmentierung Fehler

char *text; 
text = (char *) malloc(sizeof (char)); 
int size = 1; 
char c = 'a'; 
char *new; 
while (1) { 
    c = getchar(); 
    putchar(c); 
    if (c == 10) { 
     text[size - 1] = '\0'; 
     break; 
    } 
    text[size - 1] = c; 
    size++; 
    new = (char *) realloc(text, size * sizeof (*new)); 
    free(text); 
    text = new; 
} 
+0

[Bitte lesen Sie in dieser Diskussion, warum nicht den Rückgabewert von 'malloc()' und Familie in 'C' zu werfen.] (Http://stackoverflow.com/q/605845/2173917). –

+7

remove 'free (text);', das ist falsch und nicht erforderlich, 'realloc()' kümmert sich. –

+0

Fall des Lesens der Manpage hier. –

Antwort

1

In Ihrem Code, übergeben Sie text als erstes Argument zu realloc() und später, ohne Fehlerüberprüfung, Sie gleich free() passieren. Das ist es, was das Problem hier verursacht.

Per C11, Kapitel §7.22.3.5

Die realloc Funktion freigibt das alte Objekt zu spitz durch ptr und gibt einen Zeiger auf ein neues Objekt, das die Größe von Größe angegeben hat. [...] Wenn Speicher für das neue Objekt nicht zugewiesen werden kann, wird das alte Objekt nicht freigegeben und sein Wert ist unverändert.

Also, wenn der realloc() Erfolg, danach ruft

free(text); 

ruft undefined behavior. Sie müssen sich nicht mehr um text kümmern, entfernen Sie den Anruf zu free().

Verwandte, für free(), §7.22.3.3

[...] Andernfalls, wenn das Argument einen Zeiger nicht früher passen durch eine Speicherverwaltung Funktion zurückgegeben, oder wenn der Raum war durch einen Aufruf an free oder realloc freigegeben, ist das Verhalten undefiniert.

TL; DR Erste Kontrolle für den Erfolg realloc(), wenn der Erfolg nicht berühren text, wenn realloc() ausfällt, dann müssen Sie free(text);

0

Sie anrufen sollte nicht den Zeiger frei text weil bei Erfolg die Zuordnung des alten Zeigers aufhebt.

Von C11 Standard Kapitel 7.22.3.5 Die realloc Funktion:

Die realloc Funktion das alte Objekt auf den ptr zeigt und gibt einen Zeiger auf ein neues Objekt freigibt, die die Größe von Größe angegeben hat. Der Inhalt des neuen Objekts muss vor der Freigabe dem alten Objekt entsprechen, bis auf das kleinere der Zeichen der neuen und der alten Größe. Alle Bytes im neuen Objekt über die Größe des alten Objekts hinaus haben unbestimmte Werte.

+0

meinst du Zeiger 'text'? –