我遇到过这段代码:
struct test
{
uint32 num_fields;
char array_field [];
};
我如何理解array_field
?这是C语言的gcc扩展吗?
答案 0 :(得分:15)
这是一个C99功能,称为灵活数组成员,通常用于创建可变长度数组。
它只能指定为 struct 的最后一个成员而不指定大小(如array_field [];
中所示)。
例如,您可以执行以下操作,成员arr
将为其分配5个字节:
struct flexi_example
{
int data;
char arr[];
};
struct flexi_example *obj;
obj = malloc(sizeof (struct flexi_example) + 5);
这里讨论了它的优缺点:
答案 1 :(得分:1)
此类结构通常在堆上以计算的大小分配,代码如下:
#include <stddef.h>
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;
}