[ANSI-C] Groesse von dynamischen Felder speichern
Hallo Kirsten
Es gibt unter C die Möglichkeit die Größe eines selbstangelegten dynamischen Feldes zu speichern. Dazu muß man nur den eigentlichen Anfang des Feldes um die Größe einer int-Variable nach hinten verschieben und in den „frei“ gewordenen Speicherplatz kannst du dann die Größe speichern.
Wenn du dann als Feldzeiger den „verschobenen“ Anfang verwendest, kannst du das Feld wie gewohnt verwenden. Beim Freigeben des Speichers mußt du allerdings darauf achten, das du den tatsächlichen Anfang des dynamisch angeforderten Speichers wieder freigibt, da es sonst zu einer Access-Voilation kommt.
Ich hab mir mal erlaubt ein paar Funktionen zu schreiben, die die Sache etwas erleichtern könnten:
#include
// FIELD\_TYPE gibt die Art des Feldes an. Es kann jede Beliebige Art von Feld
// erzeugt werden, Jedoch kann die Art des Feldes nicht zur Laufzeit veraendert
// werden.
#define FIELD\_TYPE char
int dfield\_get\_size(FIELD\_TYPE\* Feld)
{
int size=-1;
if(Feld)
{
int\* realstart = (int\*)Feld;
size = \*(realstart-1);
}
return size;
}
void dfield\_free(FIELD\_TYPE\* Feld)
{
if(Feld)
{
int\* realstart=(int\*)Feld;
free(realstart-1);
}
return;
}
FIELD\_TYPE\* dfield\_create(int size)
{
FIELD\_TYPE\* neu=NULL;
if(size\>=0)
{
// Speicher fuer das neue Feld anlegen. Auch leere Felder sind moeglich.
// nicht jedoch negative Werte
neu = (FIELD\_TYPE\*)malloc(sizeof(FIELD\_TYPE)\*size+sizeof(int));
if(neu)
{
int\* sizeptr = (int\*)neu;
// neuen Anfangspunkt des Feldes berechnen
// Der Startpunkt wird um die Groesse eines int-Wertes verschoben
neu = (FIELD\_TYPE\*)(sizeptr+1);
// Groesse des Feldes speichern
\*sizeptr = size;
}
}
return neu;
}
Und mit der folgenden Main kannst du gucken das das auch tut:
void main (void)
{
FIELD\_TYPE\* MeinFeld;
MeinFeld = dfield\_create(20);
printf("Die Groesse des Feldes betraegt %d\n", dfield\_get\_size(MeinFeld));
strcpy(MeinFeld, "1234567890");
printf("Die Groesse des Feldes betraegt %d\n", dfield\_get\_size(MeinFeld));
printf("Inhalt : \"%s\"\n", MeinFeld);
dfield\_free(MeinFeld);
return;
}
Gruss Jens