Arraylänge ermitteln

Hallo!

Ich hoffe mir kann jemand bei folgendem Problem helfen. Aber ich bin mir nicht mal sicher, ob das überhaupt geht.

Ich habe einen Zeiger auf einen Array, der mit folgendem Typen gefüllt ist:

typedef union {
char as_char;
short as_short;
unsigned char *as_pointer;
} Item;

Ich habe wie gesagt nur den Zeiger auf diesen Array. Jetzt möchte ich aber die Anzahl der Elemente in dem Array herausfinden. Weiß jemand wie das geht?
Für alle Hinweise bin ich sehr dankbar!
Kirstin

Hallo Kirstin,

das geht afaik nicht mit zeigern auf Arrays. Aber als alternative
könntest du z.B. eine globale Variable int size; benutzen und
diese jeweils erhöhen bzw. erniedrigen, wenn ein Element
dazukommt oder entfernt wird.

Ciao,

Fred

[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