为什么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/

10-12 00:13
查看更多