可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have encounter such code:
struct test { uint32 num_fields; char array_field []; };
How to understand array_field? Is this a gcc extension for C language?
回答1:
It's a C99 feature, called flexible array member which is typically used to create a variable length array.
It can only be specified as the last member of a struct without specifying the size (as in array_field [];
).
For example, you can do the following and the member arr
will have 5 bytes allocated for it:
struct flexi_example { int data; char arr[]; }; struct flexi_example *obj; obj = malloc(sizeof (struct flexi_example) + 5);
Its pros/cons discussed here:
Flexible array members in C - bad?
回答2:
Such structures are usually allocated on the heap with a calculated size, with code such as the following:
#include struct test * test_new(uint32 num_fields) { size_t sizeBeforeArray = offsetof(struct test, array_field); size_t sizeOfArray = num_fields * sizeof(char); struct test * ret = malloc(sizeBeforeArray + sizeOfArray); if(NULL != ret) { ret->num_fields = num_fields; } return ret; }