C Struct array member without specific length

匿名 (未验证) 提交于 2019-12-03 02:05:01

问题:

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; } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!