可变长度阵列和灵活阵列成员之间有什么区别?

时间:2015-11-29 02:30:00

标签: c c99 variable-length-array flexible-array-member

我在ISO C99 committee draft中看到结构可能有一个不完整的数组,其大小未指定,称为灵活数组成员。

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

我认为FAM是一种特殊的VLA,但我看到有两个SO用户声称不是。另外,阅读Wikipedia section on sizeof,它表示sizeof对这两个人的行为有所不同。

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

此外,其他相关行为对于每个行为都有所不同?

1 个答案:

答案 0 :(得分:5)

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

灵活的数组成员。这意味着结构可以在末尾具有未知大小的成员。 C标准的例子:

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

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

这也是在C99之前使用的,但它是未定义的行为,被称为另一个答案中提到的“struct hack”。在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