Guybrush Threepwood Geschrieben 21. Oktober 2002 Geschrieben 21. Oktober 2002 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 Zitieren
Klotzkopp Geschrieben 21. Oktober 2002 Geschrieben 21. Oktober 2002 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. Zitieren
Guybrush Threepwood Geschrieben 21. Oktober 2002 Autor Geschrieben 21. Oktober 2002 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 Zitieren
Klotzkopp Geschrieben 21. Oktober 2002 Geschrieben 21. Oktober 2002 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. Zitieren
Guybrush Threepwood Geschrieben 21. Oktober 2002 Autor Geschrieben 21. Oktober 2002 wenn ich aber hingehe und sage: char *t; und dann sizeof(*t); bekomme ich 1 zurück. Zitieren
Klotzkopp Geschrieben 21. Oktober 2002 Geschrieben 21. Oktober 2002 *t ist ein char. Vielleicht meinst Du &t? Das wäre ein char**. Zitieren
Guybrush Threepwood Geschrieben 21. Oktober 2002 Autor Geschrieben 21. Oktober 2002 wenn ich schreibe &t bekomme ich auch vier. was meinst du mit *t ist ein char? Zitieren
Klotzkopp Geschrieben 21. Oktober 2002 Geschrieben 21. Oktober 2002 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. Zitieren
Guybrush Threepwood Geschrieben 21. Oktober 2002 Autor Geschrieben 21. Oktober 2002 Autsch, ja ist klar irgendwie hab ich voll auf dem Schlauch gestanden:rolleyes:. Danke! Gruß Guybrush Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.