Flexibilní člen pole - Flexible array member
C struktur datové typy mohou končit a flexibilní pole člen[1] bez zadané velikosti:
struktur vectord { krátký len; // musí existovat alespoň jeden další datový člen dvojnásobek přílet[]; // člen flexibilního pole musí být poslední // Kompilátor si zde může vyhradit další prostor pro polstrování, stejně jako mezi členy struktury};
Tyto struktury obvykle slouží jako záhlaví ve větším, variabilní alokace paměti:
struktur vectord *vektor = malloc(...);vektor->len = ...;pro (int i = 0; i < vektor->len; i++) vektor->přílet[i] = ...; // transparentně používá správný typ (double)
Vliv na velikost struktury a polstrování
The velikost
operátor na takové a struktur
udává velikost struktury, jako kdyby byl člen flexibilního pole prázdný. To může zahrnovat polstrování přidané pro uložení pružného prvku; překladač také může takové polstrování znovu použít jako součást samotného pole.[2]
Je běžné přidělovat sizeof (struct) + pole_len*velikost(prvek pole)
bajtů.
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 zahrnuty v sizeof (struct)
. V případě obav jsou k dispozici makra[3] vypočítat minimální velikost a zároveň zajistit, aby nedošlo k narušení polstrování kompilátoru.
Protože pole může začínat v polstrování před koncem struktury, jeho obsah by měl být vždy přístupný prostřednictvím indexování (arr [i]
) nebo kompenzace
, ne velikost
.
Dostupnost
Členové flexibilního pole byli oficiálně standardizováni v C99,[4] překladače však přijaly členy pole nulové velikosti se stejným účinkem (např. GCC,[5] Microsoft Visual C[6]).
Členové flexibilního pole nejsou oficiálně součástí C ++, ale stejná rozšíření kompatibility[7] existovat.
Reference
- ^ "Méně známé funkce C". Citováno 30. prosince 2014.
- ^ "člen flexibilního pole". Blog Jensa Gustedta. 14. března 2011. Citováno 9. října 2018.
- ^ "P99: Flexibilní členové pole". p99.gforge.inria.fr. Citováno 9. října 2018.
- ^ C99 oddíl §6.7.2.1, položka 16, strana 103, http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
- ^ "Zero Length - Using the GNU Compiler Collection (GCC)". Citováno 30. prosince 2014.
- ^ "Deklarace struktury". Microsoft. Citováno 25. dubna 2020.
- ^ Např., "Pole (C ++)". Microsoft. Citováno 25. dubna 2020.
Pole s nulovou velikostí je legální pouze v případě, že je pole posledním polem ve struktuře nebo unii a když jsou povolena rozšíření Microsoft (/ Ze).