[FAQ] Dynamischer Speicher mit malloc/calloc/realloc/free
-
jepp schrieb:
gut, dann fang schonmal an
okay, -->
X. malloc(0)
Ein Aufruf von malloc() mit 0 als Argument ist implementationsabhängig. Es sind zwei Resultate möglich.
1. malloc() gibt einen NULL Zeiger zurück.
2. malloc() gibt einen Zeiger ungleich NULL zurück. Obwohl kein benutzbarer Speicher alloziert wurde, existiert auf dem Heap ein Listeneintrag, der mit free() wieder gelöscht werden muß.
-
gut,
man könnte sich die frage stellen, welcher grund einen programmierer bewegen könnte 0 byte arbeitsspeicher anzufordern *grübel*
-
jepp schrieb:
man könnte sich die frage stellen, welcher grund einen programmierer bewegen könnte 0 byte arbeitsspeicher anzufordern *grübel*
das könnte z.b. bei berechneten mallocs passieren, etwa bei malloc (a * sizeof(b));, wenn b 0 ist.
-
Gut, aber das ist dann ein Bug den man fixt ohne wissen zu müssen wie malloc() in so einem Fall reagiert (was ja eh wieder "implementation defined" wäre).
edit: außerdem meinst du wohl eher "wenn a 0 ist"
-
Tim schrieb:
edit: außerdem meinst du wohl eher "wenn a 0 ist"
ja, das meinte ich.
-
Ich fände es gut, wenn du die richtige Verwendung von man: realloc(3) erklären könntest. Man sieht zu oft
p = realloc(p, N)
.
-
rüdiger schrieb:
Ich fände es gut, wenn du die richtige Verwendung von man: realloc(3) erklären könntest. Man sieht zu oft
p = realloc(p, N)
.Das habe ich mir hier, etwas kryptisch vielleicht, notiert:
TODO: Mögliches Speicherleck bei falschem Aufruf von realloc()
-
btw. zum casten von malloc. Auf m68k kann das wohl böse enden, da Adressen und Integer dort unterschiedliche Register haben: http://www.grep.be/blog/en/computer/debian/m68k/broken_c_code
-
rüdiger schrieb:
btw. zum casten von malloc. Auf m68k kann das wohl böse enden, da Adressen und Integer dort unterschiedliche Register haben
das war wohl eher ein unfähiger compiler, der casts nicht richtig beherrscht.
-
nö, weil in dem Beispiel in der Datei mit der main-Funktion die Funktion als void *f(); deklariert wurde. Aber das ist auch total OT...
-
rüdiger schrieb:
nö, weil in dem Beispiel in der Datei mit der main-Funktion die Funktion als void *f(); deklariert wurde.
stimmt, du hast recht. falscher prototyp, das hab' ich übersehen.