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.
Man soll den Tag nicht vor dem Abend loben.
Und den Mann nicht vor dem Morgen.
(alte Volksweisheit)