C Struct数组成员没有特定长度

我遇到过这段代码:

struct test { uint32 num_fields; char array_field []; }; 

我怎么能理解array_field ? 这是C语言的gcc扩展吗?

它是C99function,称为灵活数组成员 ,通常用于创建可变长度数组。

它只能指定为结构的最后一个成员而不指定大小(如array_field []; )。


例如,您可以执行以下操作,并且成员arr将为其分配5个字节:

 struct flexi_example { int data; char arr[]; }; struct flexi_example *obj; obj = malloc(sizeof (struct flexi_example) + 5); 

它的优点/缺点在这里讨论:

C中的灵活arrays成员 – 糟糕吗?

此类结构通常在堆上以计算的大小分配,代码如下:

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