40 Stimmen

Überschreibt realloc alte Inhalte?

Bei der Neuzuweisung von Speicher über realloc() werden die bisherigen Inhalte überschrieben? Ich versuche, ein Programm zu erstellen, das jedes Mal, wenn wir die Daten eingeben, den Speicher neu zuweist.

Bitte sagen Sie mir über Speicherzuweisung über realloc, ist es Compiler abhängig zum Beispiel?

94voto

pmg Punkte 102904

Kümmern Sie sich nicht um den alten Inhalt.

Die richtige Verwendung realloc ist es, einen bestimmten Zeiger für die Neuzuweisung zu verwenden, diesen Zeiger zu testen und, wenn alles funktioniert hat, den alten Zeiger zu ändern

int *oldpointer = malloc(100);

/* ... */

int *newpointer = realloc(oldpointer, 1000);
if (newpointer == NULL) {
    /* problems!!!!                                 */
    /* tell the user to stop playing DOOM and retry */
    /* or free(oldpointer) and abort, or whatever   */
} else {
    /* everything ok                                                                 */
    /* `newpointer` now points to a new memory block with the contents of oldpointer */
    /* `oldpointer` points to an invalid address                                     */
    oldpointer = newpointer;
    /* oldpointer points to the correct address                                */
    /* the contents at oldpointer have been copied while realloc did its thing */
    /* if the new size is smaller than the old size, some data was lost        */
}

/* ... */

/* don't forget to `free(oldpointer);` at some time */

15voto

ChrisW Punkte 53239

Er vergrößert den bereits zugewiesenen Speicher, ohne den vorhandenen Inhalt zu überschreiben, oder (wenn er nicht wachsen kann) weist er neuen, größeren Speicher an einer anderen Stelle zu und kopiert den vorhandenen Inhalt aus dem vorherigen Speicher in den neuen Speicher.

9voto

jhabbott Punkte 17551

Sie sollten so programmieren, dass der alte Zeiger überschrieben wird, ja. Der alte Speicher wird nicht mehr zugewiesen und kann daher von einem anderen Teil Ihres Programms (oder z. B. einem System-Thread) neu zugewiesen und jederzeit überschrieben werden, nachdem Sie realloc aufgerufen haben.

Der neue Speicher enthält immer die gleichen Daten wie der alte Speicher (sie werden bei Bedarf für Sie kopiert), aber nur bis zur Größe des alten Blocks, der darüber hinausgehende Platz wird nicht initialisiert.

Wenn Sie eine Kopie wollen, machen Sie ein neues malloc und verwenden Sie memcpy.

Wenn Sie realloc aufrufen, wird die Implementierung von erhöhen. die Größe, könnte eines dieser Dinge passieren:

  • Ein neuer Block wird zugewiesen und der Inhalt des alten Speichers kopiert, der alte Block wird freigegeben, der neue Zeiger wird zurückgegeben.
  • Wenn der Bereich nach dem Block nicht zugewiesen ist, kann der bestehende Block erweitert und derselbe Zeiger zurückgegeben werden.

Da Sie nicht wissen können, was passiert ist, oder sogar, wenn eine völlig andere Implementierung als die oben vorgeschlagene verwendet wird, sollten Sie immer gemäß der Spezifikation von realloc programmieren, d. h., Sie dürfen den alten Zeiger nicht mehr verwenden und müssen den neuen verwenden.

6voto

Es ist schwer zu sagen, was Sie fragen, aber wenn Sie fragen, ob Sie den "alten Inhalt" an der alten Adresse lesen können, die an realloc lautet die Antwort keine . In manchen Fällen finden Sie dort einen Teil oder den gesamten alten Inhalt, aber wenn realloc denselben Zeiger zurück, den Sie ihm übergeben haben, ist jede Verwendung des alten Zeigers undefiniertes Verhalten .

Wenn Sie lediglich fragen, ob der alte Inhalt an der neuen Adresse erhalten bleibt, die von realloc lautet die Antwort: Ja (bis zum Minimum aus alter und neuer Größe).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X