Veröffentlicht 21. Oktober 200222 j Hi, wie kann ich bei folgendem Beispiel die Größe in Bytes des Arrays 't' ermitteln? #define ANZAHL 1000000 #define STELLEN 700 char **t; main() { t = (char**)calloc(ANZAHL,sizeof(char*)); for (int i=0; i<ANZAHL; i++) { t[i] =(char*)calloc(STELLEN,sizeof(char)); for (int u=0; u<STELLEN-1; u++) t[i][u] = 'a'; t[i][u+1] = '\0'; } printf("%i\t%s\n",sizeof(t),t[ANZAHL-1]); free(t); return 0; } [/PHP] Es müßten ja am Ende 700MB für t reserviert sein, aber mit sizeof(t) bekomme ich immer 4 ausgegeben da ein Pointer ja 4 Byte groß ist. Gruß Guybrush
21. Oktober 200222 j Du kannst über einen Zeiger nicht herausfinden, wie groß der allokierte Speicherbereich ist, auf den der Zeiger zeigt. Dir wird nichts anderes übrig bleiben, als die Größe selbst nachzuhalten.
21. Oktober 200222 j Autor Ah, ok danke. Ähm noch ne andere Frage. Ein char ist ja 1 Byte groß, einer Zeiger auf ein Byte ist 4 Byte groß (wie jeder einfache Zeiger), warum ist denn dann ein Zeiger auf einen Zeiger auf ein char nur 1 Byte anstatt 4 Byte groß, das ist doch auch ein Zeiger Gruß Guybrush
21. Oktober 200222 j Original geschrieben von Guybrush Threepwood warum ist denn dann ein Zeiger auf einen Zeiger auf ein char nur 1 Byte anstatt 4 Byte groß, das ist doch auch ein ZeigerWie kommst Du darauf? Bei mir ist sizeof( char** ) 4.
21. Oktober 200222 j Autor wenn ich aber hingehe und sage: char *t; und dann sizeof(*t); bekomme ich 1 zurück.
21. Oktober 200222 j Autor wenn ich schreibe &t bekomme ich auch vier. was meinst du mit *t ist ein char?
21. Oktober 200222 j Der Stern hat (wenn man mal vom Multiplikationsoperator absieht) zwei Bedeutungen: Er dient zur Deklaration eines Zeigers, oder oder als sogenannter Dereferenzierungsoperator. Der Derefenzierungsoperator kann nur auf Zeiger angewendet werden, und macht daraus das Objekt, auf das der Zeiger zeigt. Er ist praktisch die Umkehrung des Adressoperators &. Beispiel: int x = 1; int y = 2; int* p = &x; // p zeigt auf x *p = 4; // jetzt ist x = 4 p = &y; // jetzt zeigt p auf y (*p)++; // jetzt ist y = 3 Die Klammern in der letzten Zeile sind notwenig, weil der Postinkrementoperator eine höhre Priorität als der Derefenzierungsoperator hat. Würde man die Klammern weglassen, würde zuerst der Zeiger inkrementiert, und danach derefenziert, mit unabsehbaren Folgen.
21. Oktober 200222 j Autor Autsch, ja ist klar irgendwie hab ich voll auf dem Schlauch gestanden:rolleyes:. Danke! Gruß Guybrush
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.