为什么C允许这样做:
类型定义结构
{
国际航空公司[];
}秒;
其中数组arr
没有指定大小?
最佳答案
这是C99的特性,称为灵活数组,主要特点是允许use variable length array like features inside a struct和R。在这个answer to another question on flexible array members中提供了使用灵活数组在指针上的好处列表。6.7.2.1
节中的draft C99 standard结构和联合说明符第16段说:
作为特殊情况,具有多个命名成员的结构的最后一个元素可以
有一个不完整的数组类型;这称为一个灵活的数组成员。在大多数情况下,
忽略柔性阵列成员。尤其是,结构的大小
灵活的数组成员被省略,除了它可能有更多的尾随填充比
这一遗漏意味着。[…]
因此,如果有s*
则除了结构所需的空间外,还可以为数组分配空间,通常结构中还有其他成员:
s *s1 = malloc( sizeof(struct s) + n*sizeof(int) ) ;
标准草案在第17段中实际上有一个有益的例子:
声明后的示例:
struct s { int n; double d[]; };
结构结构
s
具有灵活的数组成员d
。一种典型的使用方法是:
int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
假设对
malloc
的调用成功,则指向p
的对象在大多数情况下,行为就像
p
被声明为: struct { int n; double d[m]; } *p;
(在某些情况下,这种等价性被打破;特别是
成员
d
的偏移量可能不同)。关于c - 结构体中未调整大小的数组声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20221012/