Ich stehe hier mit einer kleinen Übung zu realloc etwas auf dem Schlauch.
Konkret geht es um folgendes Beispiel:
Code: Alles auswählen
/* more_mem.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF 8192
int main(void) {
char *buffer;
int reserviert=0;
int i;
static size_t len = BUF; /* Speicheranforderung */
buffer = malloc(sizeof("Hallo Welt"));
strcpy(buffer, "Hallo Welt");
while(reserviert != BUF && len != 0) {
buffer = realloc(buffer, len);
/* Speicher konnte nicht alloziert werden. */
if(buffer == NULL) {
len /= 2; /* Versuchen wir es mit der Hälfte. */
}
else {
reserviert += len;
}
}
for(i = 0; i < reserviert; i++)
buffer[i] = 'x';
buffer[i]='\0';
printf("\n%s\n",buffer);
return EXIT_FAILURE;
}
Praktisch kann ich es leider auch nicht nach nachprüfen, da bei mir der Speicher natürlich erfolgreich reserviert wird.
Zwei Dinge verstehe ich hier nicht:
1) buffer beinhaltet ja die Adresse, die mir malloc zu Beginn zugewiesen hatte. An dieser Stelle steht ja mein "Hallo Welt".
Sollte jetzt realloc tatsächlich fehlschlagen, wird mir doch die Adresse, die in buffer gespeichert ist, mit NULL überschrieben.
Das muss ja eigentlich auch laut des Beispieles so sein, denn wieso sollte man sonst buffer == NULL prüfen?
Ich hätte also ein Memory-Leak und mein "Hallo Welt" verloren. Nein?
2) Bei realloc muss ich doch die neue totale Grösse angeben und nicht blos den Wert, um den vergrössert werden soll.
Nur wird "len" ja immer kleiner, sofern nicht genügend zusammenhängender Speicher reserviert werden kann.
Müsste da also nicht sowas wie
Code: Alles auswählen
realloc(buffer, reserviert + len);
Weiter schreibt der Autor über malloc:
Und einige Seiten später:Zur dynamischen Speicherverwaltung wird ein Zeiger an die Funktion malloc() übergeben, der später die Anfangsadresse der dynamischen Datenstruktur enthalten soll.
Ich verstehe nicht, wie das gemeint ist. Ich übergebe malloc() doch keinen Zeiger - vielmehr bekomme ich doch einen void-Zeiger von malloc() zurück. Nein?Die Tatsache, dass Zeiger in C grundsätzlich typisiert sind, spielt hier keine Rolle, denn malloc() bekommt ja grundsätzlich void-Zeiger übergeben.
Gruss starcow