4

我在ISO C99 委员会草案中看到,结构可以有一个不完整的数组,其末端未指定大小,称为灵活数组成员。

另一方面,C99 也有可变长度数组,它允许在编译时声明大小不恒定的数组。

我认为 FAM 是一种特殊的 VLA,但我看到两个 SO 用户声称不同。此外,阅读Wikipedia 上的部分sizeof,它说这sizeof两者的行为不同。

为什么它们都存在而不是只有一个?(他们的用例是否太不同了?)

此外,还有哪些其他相关行为对于它们每个人来说是不同的?

4

1 回答 1

5

C99 标准添加了两个不同的东西,它们很容易被错误地混淆:

灵活的数组成员。这意味着一个结构最后可以有一个未知大小的成员。来自 C 标准的示例:

    struct s { int n; double d[]; };

int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));

这在 C99 之前也使用过,但后来是未定义的行为,称为另一个答案中提到的“结构黑客”。在 C90 之前,结构末尾可能会有意外的填充字节,从而导致错误。

可变长度数组 (VLA)。这些是在运行时设置大小的数组。它们很可能是由编译器通过使用动态内存分配来实现的。例子:

void func (int n)
{
  int array[n];
}

从 user29079 引用:https ://softwareengineering.stackexchange.com/questions/154089/c-flexible-arrays-when-did-they-become-part-of-the-standard

于 2015-11-29T02:43:34.237 回答