21.5 Dynamisches Array mit flexiblen Elementen 

Neu ab dem C99-Standard ist auch die Möglichkeit, das letzte Element in einer Struktur als unvollständiges Array ohne Längenangabe zu deklarieren. Dieses Feature kann man sich zunutze machen, um beispielsweise ein dynamisches Array zu erstellen. Hier sehen Sie ein Beispiel für ein solch flexibles Element:
typedef struct { int len; int iarray[]; } Vint_t;
Sie müssen hierbei allerdings berücksichtigen, dass flexible Elemente nicht bei der Größe der Struktur beachtet werden. Das Alignment (Füllbyte) wird hierbei trotzdem eingehalten. Um hier also beispielsweise für die Struktur Vint_t Speicher zu reservieren, müssen Sie beachten, dass Sie extra für das flexible Element ebenfalls Speicherplatz reservieren. Folgendes reicht also nicht aus:
Vint_t *Viptr = malloc ( sizeof( Vint_t) );
Hier haben Sie zwar Speicher für die Struktur reserviert, aber nicht für die flexiblen Elemente. Somit muss die Allokation von Speicher wie folgt aussehen:
#define LEN 10 // Anzahl flexibler Elemente ... Vint_t *Viptr = malloc ( sizeof(Vint_t) + LEN*sizeof(int) ); Viptr->len = LEN;
Hier folgt ein komplettes Beispiel dazu. Es wird Platz für eine Struktur vom Typ Vint_t mit 10 flexiblen Elementen reserviert. Die Elemente werden in der Schleife mit einem sinnlosen Wert versehen und anschließend innerhalb einer anderen Schleife wieder ausgegeben.
/* flexibel.c */ #include <stdio.h> #include <stdlib.h> #define LEN 10 typedef struct { int len; int iarray[]; } Vint_t; int main(void) { Vint_t *Viptr = malloc(sizeof(Vint_t) + LEN*sizeof(int)); Viptr->len = LEN; for( int i = 0; i < Viptr->len; i++ ) Viptr->iarray[i] = i*i; for( int i = 0; i < Viptr->len; i++ ) printf("Viptr->iarray[%d]: %3d\n", i ,Viptr->iarray[i]); return EXIT_SUCCESS; }
Eine Initialisierung von flexiblen Elementen ist laut C99-Standard nicht erlaubt. Ein Beispiel dafür wäre:
// Gemäß C99-Standard nicht zulässig Vint_t Viarr1 = { 4, { 1, 2, 4, 8 }};
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.