PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ansi C: (mc)alloc && free, Speicherzählung



Thomas Engelke
02-09-2003, 08:59
Wie kann man sich den durch m/calloc allokierten Speicher bzw. dessen Größe in Byte hinter einem Zeiger geben lassen?

1. Vermutung: Diesen kann es nicht geben, da es kein \0-Byte am Ende gibt. Aber wie arbeitet dann free()?
2. Vermutung: Ein sizeof() liefert die Größe des Zeigers.

Danke für Hilfe.

AD!

wraith
02-09-2003, 09:15
Original geschrieben von Thomas Engelke
Wie kann man sich den durch m/calloc allokierten Speicher bzw. dessen Größe in Byte hinter einem Zeiger geben lassen?

1. Vermutung: Diesen kann es nicht geben, da es kein \0-Byte am Ende gibt. Aber wie arbeitet dann free()?

Es gibt keinen standardkonformen Weg die Größe abzufragen,aber viele Implementierungen liefern eine Funktion mit die das ermöglicht.
Dazu mußte mal im Header malloc.h nachsehen (der kein Standardheader ist),unter Windows gibt es z.b eine Funktion _msize und unter Linux iirc malloc_usable_size.

Diese Funktionen greifen auf die internen Verwaltungsstrukturen zurück,die auch die Implementierung benutzt,um einen korrekten free Aufruf machen zu können.
Aber der Wert entspricht meist nicht dem den du angefordert hast (weil größer).
Wie und wo die Wert letztendlich abgespeichert werden ist implementierungsabhängig.
Hier sind zwei Möglichkeiten beschrieben,die ein C++ Compiler für new/delete benutzen kann
http://www.parashift.com/c++-faq-lite/compiler-dependencies.html#faq-37.7



2. Vermutung: Ein sizeof() liefert die Größe des Zeigers.

Deine zweite Vermutung stimmt,sizeof liefert die Größe des Zeigers,und die ist auf 32 Bit Machinen immer 4 Bytes.
Also damit kannst du nichts anfangen.

Thomas Engelke
02-09-2003, 09:38
Danke für die ausführliche antwort, wraith.

AD!