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

What are the differences between Variable Length Arrays and Flexible Array Member?

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

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

我认为 FAM 是一种特殊的 VLA,但我看到两个 SO 用户提出不同的说法。此外,阅读 Wikipedia section on sizeof,它说 sizeof 对这两个行为不同。

为什么两者都存在而不是只有一个? (他们的用例是不是太不一样了?)

此外,还有哪些其他相关行为对于它们各自不同?

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