Flexibilní člen pole - Flexible array member

Datové typy C struct mohou končit flexibilním členem pole bez zadané velikosti:

struct vectord {
    short len;    // there must be at least one other data member
    double arr[]; // the flexible array member must be last
    // The compiler may reserve extra padding space here, like it can between struct members
};

Takové struktury obvykle slouží jako záhlaví ve větší alokaci proměnné paměti :

struct vectord *vector = malloc(...);
vector->len = ...;
for (int i = 0; i < vector->len; i++)
     vector->arr[i] = ...;  // transparently uses the right type (double)

Vliv na velikost struktury a polstrování

sizeof Operátor na takový struct udává velikost struktury, jako v případě, že pružný prvek pole byly prázdné. To může zahrnovat polstrování přidané pro uložení pružného prvku; kompilátor také může znovu použít takové polstrování jako součást samotného pole.

Je běžné přidělit bajty. sizeof(struct) + array_len*sizeof(array element)

To není špatné, ale může přidělit několik dalších bajtů, než je nutné: kompilátor může znovu použít některé výplně, které jsou součástí sizeof(struct) . Pokud by to mělo být znepokojivé, jsou k dispozici makra pro výpočet minimální velikosti a zároveň zajišťují, že výplň kompilátoru nebude narušena.

Vzhledem k tomu, že pole může začínat v polstrování před koncem struktury, měl by se k jeho obsahu vždy přistupovat prostřednictvím indexování ( arr[i] ) nebo offsetof ne sizeof .

Dostupnost

Členové flexibilního pole byli oficiálně standardizováni v C99 . V praxi je překladače (např. GCC , Microsoft Visual C ) poskytovaly dlouho před standardizací C99.

Členové flexibilního pole nejsou oficiálně součástí C ++ , ale rozšíření jazyka jsou široce dostupná.

Reference