Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Flexible array member

From Wikipedia, the free encyclopedia
C language feature in which a struct may contain as its last member an array with no specified size

Cstruct data types may end with aflexiblearray member[1] with no specified size:

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

Typically, such structures serve as the header in a larger,variable memory allocation:

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

Effect on struct size and padding

[edit]

Thesizeof operator on such astruct gives the size of the structure as if the flexible array member were empty. This may include padding added to accommodate the flexible member; the compiler is also free to re-use such padding as part of the array itself.[2]

It is common to allocatesizeof(struct) +array_len*sizeof(array element) bytes.

This is not wrong, but it may allocate a few more bytes than necessary: the compiler may be re-purposing some of the padding that is included insizeof(struct). Should this be a concern, macros are available[3] to compute the minimum size while ensuring that the compiler's padding is not disrupted.

As the array may start in the padding before the end of the structure, its content should always be accessed via indexing (arr[i]) oroffsetof, notsizeof.

Availability

[edit]

Flexible array members were officially standardized inC99.[4] In practice, compilers (e.g.,GCC,[5]MSVC[6]) provided them well before C99 was standardized.

Flexible array members are not officially part ofC++, but language extensions[7] are widely available.

References

[edit]
  1. ^"Lesser known C features". RetrievedDecember 30, 2014.
  2. ^"flexible array member".Jens Gustedt's Blog. March 14, 2011. RetrievedOctober 9, 2018.
  3. ^"P99: Flexible array members".p99.gforge.inria.fr. RetrievedOctober 9, 2018.
  4. ^C99 section §6.7.2.1, item 16, page 103,http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
  5. ^"Zero Length - Using the GNU Compiler Collection (GCC)". RetrievedDecember 30, 2014.
  6. ^"Structure Declarations". Microsoft. RetrievedApril 25, 2020.
  7. ^E.g.,"Arrays (C++)". Microsoft. RetrievedApril 25, 2020.A zero-sized array is legal only when the array is the last field in a struct or union and when the Microsoft extensions (/Ze) are enabled.
Features
Standard library
Implementations
Compilers
IDEs
Comparison with
other languages
Descendant
languages
Designer
Retrieved from "https://en.wikipedia.org/w/index.php?title=Flexible_array_member&oldid=1193014376"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2025 Movatter.jp