C Array Größe bestimmen
Mark
- programmiertechnik
Hallo, habe folgenden Programmcode:
/*Global definiert*/
char *ein={'\0'};
int read()
{
ein= (char*) realloc(ein, 257);
printf("%i", sizeof(ein));
}
Leider funktioniert das Ausgeben der Arraygröße nicht. Ich glaube es liegt an dem Pointer, kann mir da jemand behilflich sein?
Hallo Mark,
/Global definiert/
ein= (char*) realloc(ein, 257);
printf("%i", sizeof(ein));
> Leider funktioniert das Ausgeben der Arraygröße nicht. Ich glaube es liegt an dem Pointer
korrekt, "ein" ist ein Pointer auf einen Charakter, und mit sizeof() erhältst du dessen Größe.
> kann mir da jemand behilflich sein?
Das ist das schöne an C ;-)
Du darfst (böse Zungen behaupten "musst") dich um alles selbst kümmern.
Aber die Größe legst du doch beim realloc fest, also ist sie dir ja bekannt. Im Zweifelsfalle musst du diese Information eben mitführen.
Größe,
Jochen
--
![](http://www.electric-lemon.de/scribble/pics/tn_picV1_016.png) Kritzeln statt texten: [Scribbleboard](http://www.electric-lemon.de/scribbleboard.php)
Das ist das schöne an C ;-)
Du darfst (böse Zungen behaupten "musst") dich um alles selbst kümmern.
Aber die Größe legst du doch beim realloc fest, also ist sie dir ja bekannt. Im Zweifelsfalle musst du diese Information eben mitführen.
Das Mitführen wollte ich eigentlich umgehen. Das Erweitern des Arrays soll irgendwann mal dynamisch erfolgen und ich brauche nur in bestimmten Fällen die Größe. Kann man denn da gar nichts machen?
Hi Mark,
Das Mitführen wollte ich eigentlich umgehen. Das Erweitern des Arrays soll irgendwann mal dynamisch erfolgen und ich brauche nur in bestimmten Fällen die Größe. Kann man denn da gar nichts machen?
nicht mit C. Für "bequeme" Programmierer gibts dann C++ oder Java.
Aber sei gewarnt ... das ist wie die dunkle Seite der Macht. Schneller, verführerischer, aber gewiss nicht mächtiger. :)
Grüße,
Jochen
Hallo,
»» Das ist das schöne an C ;-)
»» Du darfst (böse Zungen behaupten "musst") dich um alles selbst kümmern.
ja, das gefällt mir daran auch.
Das Erweitern des Arrays soll irgendwann mal dynamisch erfolgen und ich brauche nur in bestimmten Fällen die Größe. Kann man denn da gar nichts machen?
Doch: Eine Struktur definieren, die einen Zeiger und die Größe des damit referenzierten Speicherblocks enthält, und einen Wrapper für malloc(), realloc() und free() schreiben.
typedef struct
{ unsigned size;
void* addr;
} MEMDESCR;
void* my_malloc(MEMDESCR* m, int s)
{ if (m!) // make sure m is not a NULL pointer
return (NULL); // if so, decline gracefully
m->addr = malloc(s); // allocate memory
m->size = (m->addr ? s : 0); // in case of success, store size
return (m->addr);
}
void* my_realloc(MEMDESCR* m, int s)
{ if (m!) // make sure m is not a NULL pointer
return (NULL); // same as above
m->addr = realloc(m->addr, s); // re-allocate memory
m->size = (m->addr ? s : 0); // in case of success, store size
return (m->addr);
}
void my_free(MEMDESCR* m)
{ if (m!) // the usual check again
return (NULL); //
free(m->addr); // release memory
m->size = 0; // and note that in m
}
Und nun kannst du eine MEMDESCR-Struktur als Ersatz für einen einfachen Pointer nehmen, die die Größe des referenzierten Speicherblocks quasi "von allein" immer mitführt[1].
Das Konzept ist vielleicht noch nicht perfekt, nur so'ne schnell hingetippte Idee. Aber in der Art würde ich es machen.
So long,
Martin
[1] Das ist übrigens auch das Schöne, wenn man plattformabhängig sein darf: Benutzt man statt malloc() und free() direkt die Windows-Speicherverwaltung (z.B. API-Funktionen GlobalAlloc() und GlobalFree()), kann man jederzeit die Größe der zugeteilten Speicherblöcke abfragen.
Und nun kannst du eine MEMDESCR-Struktur als Ersatz für einen einfachen Pointer nehmen, die die Größe des referenzierten Speicherblocks quasi "von allein" immer mitführt[1].
Das Konzept ist vielleicht noch nicht perfekt, nur so'ne schnell hingetippte Idee. Aber in der Art würde ich es machen.So long,
Martin
Vielen Dank.
Hi,
ich weiß ja nicht ... hab ich vorhin noch geschlafen, oder was war los?
Bevor da irgendwelche Klagen kommen, möchte ich die offensichtlichsten Fehler mal schnell selbst richtigstellen.
void* my_malloc(MEMDESCR* m, int s)
{ if (m!) // make sure m is not a NULL pointer
Das muss natürlich heißen: if (!m)
Ebenso in my_realloc() und my_free(). Copy&Paste ist eine herrliche Möglichkeit, Fehler zu vervielfältigen. ;-)
void my_free(MEMDESCR* m)
{ if (m!) // the usual check again
return (NULL); //
Und hier kommt noch dazu, dass die Funktion void deklariert ist und keinen Wert zurückgeben soll.
Ciao,
Martin
Hi,
ich weiß ja nicht ... hab ich vorhin noch geschlafen, oder was war los?
Bevor da irgendwelche Klagen kommen, möchte ich die offensichtlichsten Fehler mal schnell selbst richtigstellen.
Hi,
das macht nichts. Ich weiß aber auf was du hinaus wolltest ;-)
Hello,
/Global definiert/
char *ein={'\0'};
int read()
{
ein= (char*) realloc(ein, 257);
printf("%i", sizeof(ein));
}
>
> Leider funktioniert das Ausgeben der Arraygröße nicht. Ich glaube es liegt an dem Pointer, kann mir da jemand behilflich sein?
Was bekommst Du denn als Ausgabe? Vielleicht 4?
Willst Du die Größe vom Pointer wissen oder vom Bereich, auf den er zeigt?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Was bekommst Du denn als Ausgabe? Vielleicht 4?
Jep, ich bekomme 4 raus, also die Größe vom Pointer.
Willst Du die Größe vom Pointer wissen oder vom Bereich, auf den er zeigt?
Natürlich vom kompletten Array, z.B. soll mir in dem Fall 257 ausgeben werden.