Flexible array members are a special type of array where the last element of a struct structure with more than one named member has an incomplete array type; that is, the size of the array is not specified explicitly within the structstructure.
If a dynamically sized structure is needed, flexible array members should be used.
...
In the following non-compliant code, an array of size 1 is declared, but when the struct structure itself is instantiated, the size computed for malloc()
is modified to take into account the full size of the dynamic array.
Code Block | ||
---|---|---|
| ||
struct flexArrayStruct { int num; int data[1]; }; /* ... */ /* Space is allocated for the struct */ struct flexArrayStruct *structP = malloc(sizeof(struct flexArrayStruct) + sizeof(int) * (ARRAY_SIZE - 1)); if (!structP) { /* handle malloc failure */ } structP->num = SOME_NUMBER; /* Access data[] as if it had been allocated as data[ARRAY_SIZE] */ for (i = 0; i < ARRAY_SIZE; i++) { structP->data[i] = i; } |
Wiki Markup |
---|
However, in thethis abovenon-compliant code example, the only member that is guaranteed to be valid, by strict C99 definition, is {{structP->data\[0\]}}. ThusConsequently, for all {{i > 0}}, the results of the assignment are undefined. |
...
Code Block | ||
---|---|---|
| ||
struct flexArrayStruct{
int num;
int data[];
};
/* ... */
/* Space is allocated for the struct */
struct flexArrayStruct *structP = malloc(sizeof(struct flexArrayStruct) + sizeof(int) * ARRAY_SIZE);
if (!structP) {
/* handle malloc failure */
}
structP->num = SOME_NUMBER;
/* Access data[] as if it had been allocated as data[ARRAY_SIZE] */
for (i = 0; i < ARRAY_SIZE; i++) {
structP->data[i] = i;
}
|
Wiki Markup |
---|
TheThis priorcompliant methodsolution allows the structstructure to be treated as if it had declared the member {{data\[\]}} to be {{data\[ARRAY_SIZE\]}} in a waymanner that conforms to the C99 standard. |
However, some restrictions do apply. :
- The incomplete array type must be the last element within the
...
- structure.
- You
...
- cannot have an array of
...
- structure if the
...
- structure contains flexible array members
...
- .
- Structures that contain a flexible array member cannot be used as a member in the middle of another
...
- structure.
Risk Assessment
Although the non-compliant method approach results in undefined behavior, it will does work under most architectures.
...