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á.