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

Fac*_*Bro 14 c gcc

我遇到过这段代码:

struct test                   
{                                        
 uint32       num_fields;            
 char array_field [];               
}; 
Run Code Online (Sandbox Code Playgroud)

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

P.P*_*.P. 15

它是一个C99功能,称为灵活数组成员,通常用于创建可变长度数组.

它只能被指定为的最后一个成员结构,而无需指定尺寸(如在array_field [];).


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

struct flexi_example
{
int data;
char arr[];
};


struct flexi_example *obj;

obj = malloc(sizeof (struct flexi_example) + 5);
Run Code Online (Sandbox Code Playgroud)

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

C中的灵活阵列成员 - 糟糕吗?

  • @xaxxon 添加它是因为使用此功能,您可以在结构中*内部*拥有真正的 VLA,并且您不必*两次分配内存。*这增加了可读性并减少了内存碎片和指针遍历的次数(因此也许稍微提高了性能)。 (2认同)
  • @ H2CO3:灵活的阵列成员不是VLA.特别是,应用于struct的`sizeof`不包括数组成员的大小; 你只需要自己跟踪它. (2认同)
  • 添加灵活的数组成员是为了形式化[长期存在并依赖于“struct hack”](http://stackoverflow.com/search?tab=votes&q=%2b[c]%20%22struct%20hack%22) (该搜索确实不完整,因为某些实例被遗漏了,但如果没有引号,就会出现很多垃圾)。 (2认同)