C sizeof()-Operator spinnt?

foggy80

Lt. Commander
Registriert
Juli 2008
Beiträge
1.034
Hallo,
Bei folgendem Code
Code:
char pufferC[10];
char *pufferD = (char *)malloc(10));

printf("pufferC ist %d Bytes gross\n", sizeof(pufferC));
printf("pufferD ist %d Bytes gross\n", sizeof(pufferD));

kommt in der ersten Ausgabe 10 raus, bei der zweiten 4. Das heißt, bei der ersten Ausgabe wird die Größe des Speichers ausgeben auf den pufferC zeigt und bei der zweiten Ausgabe wird die die größe des Speichers der Speicheradresse ausgegeben. Wieso ist das so? pufferC und pufferD sind beide vom Typ (char *) und die Ausgabe sollte identisch sein!!!

Vielen Dank,
foggy
 
Was genau wundert dich?
pufferC ist ein Array aus 10 Bytes, hat also auch sinnigerweise die Größe 10 Bytes.
pufferD ist ein Zeiger und hat auf einem 32bit-System die Größe 32bit, bzw 4 Bytes.

Wo ist jetzt das Problem?
 
@asdfman: pufferC ist ein pointer der auf einen reservierten speicherplatz von 10 bytes zeigt. der pointer selbst hat trotzdem noch 4 bytes!

@snow1: soll das heißen dass das nunmal so ist und man da nichts machen kann? ich würde nämlich gerne die größe des alloziierten speichers messen können.
 
sizeof() wird zur Compilezeit angewandt, weiß also nichts von den malloc Aktionen die ja zur Laufzeit erst erfolgen. Insofern wirst du wohl nicht drum rum kommen dir die Größe zu merken.
 
Weil array[10] in seiner Größe zur Compilezeit feststeht!
btw. es wurde bereits alles erklärt :).
Schau dir mal die links an...

char array[10] <-- größe steht fest und wird dann im stack angelegt,
char* array = ... <-- größe steht nicht fest und wird erst zur laufzeit initalisiert, heißt im heap angelegt
 
Na und? Du deklarierst nunmal ein Array. Ob/Was sich dahinter verbirgt, ist in erster Hinsicht ja mal irrelevant. It's not a bug, it's a feature.
 
laufzeit != compilezeit
alles was du zur laufzeit mit malloc oder new anlegt kennt der compiler doch nicht, und wenn sizeof zur compilezeit berechnet wird kann es dir nur die größe eines pointers zurück geben oder halt die des objektes, wenn es nicht mit new/malloc angelegt wurde
 
char tabelle[10]; deklariert ein Array. Mehr braucht man dazu nicht sagen.
 
@ herzog: tut es nicht, denn zur compilezeit ist bekannt wie groß ein zeiger ist. aber diese größe wird nicht ausgegeben.

@bu1137: *ironie an*danke für deine erleuchtung*ironie aus*
 
Zuletzt bearbeitet:
interessant das du es anhand solcher aussagen erst verstehst^^
dann lass ich das mit den details das nächste mal
 
Tja, wenn du's nicht kapieren willst, kann ich dir auch nicht helfen. char tabelle[10] != char *blubb;

Probier zb. mal das hier, und schau mal, was dein compiler dazu sagt:

Code:
char tabelle[10];
char *blubb = "hirnschmalz";
tabelle = blubb;
 
so noch einmal
ganz detailiert

mit char tabelle[10] wird zur compilezeit ein array mit der größe von 10 chars angelegt also 10 bytes, das wird dann so wie es ist in stack geschrieben und es ist bekannt das es 10 groß ist.
wenn du mit char* tabelle = new char[10] oder halt mit malloc speicher anlegst und dann versuchst mit sizeof() die größe heraus zu bekommen, wird er dir die größe des pointers herausschmeißen WEIL! zur compilezeit nicht bekannt war wie groß das array werden soll, es war nicht bekannt auch wenn du direkt danach mit einem festen wert initalisiert weiß der compiler es NICHT!
 
Es ist einfach definiert, dass ein sizeof auf Arrays immer die Größe des Arrays zurückliefert und nicht die Größe des Pointers, frag mich aber nicht wieso, das hat man beim Erstellen des Standards einfach so beschlossen.

Array != zusammenhängender Speicher ;)
 
Zurück
Oben