我在ISO C99 委员会草案中看到,结构可以有一个不完整的数组,其末端未指定大小,称为灵活数组成员。
另一方面,C99 也有可变长度数组,它允许在编译时声明大小不恒定的数组。
我认为 FAM 是一种特殊的 VLA,但我看到两个 SO 用户声称不同。此外,阅读Wikipedia 上的部分sizeof
,它说这sizeof
两者的行为不同。
为什么它们都存在而不是只有一个?(他们的用例是否太不同了?)
此外,还有哪些其他相关行为对于它们每个人来说是不同的?
我在ISO C99 委员会草案中看到,结构可以有一个不完整的数组,其末端未指定大小,称为灵活数组成员。
另一方面,C99 也有可变长度数组,它允许在编译时声明大小不恒定的数组。
我认为 FAM 是一种特殊的 VLA,但我看到两个 SO 用户声称不同。此外,阅读Wikipedia 上的部分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 之前也使用过,但后来是未定义的行为,称为另一个答案中提到的“结构黑客”。在 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