Größe eines Arrays ermitteln ?
-
hallo,
ich habe folgenden (von der funktion her lauffähigen) quellcode (bzw. den interessanten ausschnitt):
#include <stdio.h> #include <stdlib.h> struct item { char* value; struct item * next; }; struct item ** array_A; struct item * array_B; struct item array_C[10]; int main() { array_A = calloc(10,sizeof(struct item *)); array_B = calloc(10,sizeof(struct item *)); printf("\n Size array_A: %d", sizeof( array_A)); printf("\n Size *array_A: %d", sizeof( *array_A)); printf("\n Size **array_A: %d", sizeof(**array_A)); //<-hier hätte ich die richtige Größe erwartet printf("\n"); printf("\n Size array_C: %d", sizeof( array_B)); printf("\n Size *array_C: %d", sizeof( *array_B)); //<-hier hätte ich die richtige Größe erwartet printf("\n"); printf("\n Size array_C: %d", sizeof( array_C)); //<-hier wird die korrekte Größe angezeigt printf("\n"); return 0; }
ich habe also pointer-arrays, die auf verschiedene arten aufrufen kann, sie machen aber im grunde alle das gleiche, nämlich pointer zu den "items" speichern. das klappt im programm auch alles fehlerfrei, also die strukturen an sich und das allocieren des speichers klappt. ich möchte jetzt aber gerne die größe des arrays ermitteln, und das klappt nur für array_C richtig. bei den anderen bekomme ich nur die größe des pointers/der adresse mit 4 byte bzw. 8byte als größe, obwohl das array ja 80byte allocieren müßte - so wie es sizeof(array_C) ja auch anzeigt...
Size array_A: 4
Size *array_A: 4
Size **array_A: 8Size array_C: 4
Size *array_C: 8Size array_C: 80
jemand ne idee?
vielen dank, beste grüße...
-
Zeiger sind keine Arrays.
-
TactX schrieb:
Zeiger sind keine Arrays.
ja, das ist mir schon klar, ich greife zwar wie auf ein array zu, aber im grunde sind es nur pointer...trotzdem: gibt es ein möglichkeit zu ermitteln, wie groß (hier ja 80byte) die datenstruktur nach dem allokieren des speichers ist (normalerweise lege ich das ja dynamisch an, nicht wie hier fest mit '10') ?
-
Nein - außer du wagst dich in die Tiefen des Heap-Managers rein und suchst dort nach den Hilfsstrukturen, die er zu angeforderten Heap-Bereichen anlegt (irgendwo vermerkt sich malloc() die Größe eines angeforderten Speicherblocks, schon damit free() später weiß, wieviel RAM es wieder zurückgeben darf).
Die üblichere Möglichkeit ist es, sich selber zu merken, wie groß das Array ist (indem man immer einen Pointer UND einen int an die Funktionen übergibt, die man benötigt - oder gleich beides in einer struct verpackt).
-
hmm, na dann werde ich (wohl oder übel) den in calloc verwendeten paramter für die größe mitgeben müssen...
...oder ich setze das letzte element auf einen definierten wert und gehe beim auslesen solange durch's array, bis ich die ende-markierung (am besten wohl NULL) gefunden habe.