我在ISO C99 committee draft中看到结构可能有一个不完整的数组,其大小未指定,称为灵活数组成员。
另一方面,C99还有可变长度数组,它允许在编译时声明大小不恒定的数组。
我认为FAM是一种特殊的VLA,但我看到有两个SO用户声称不是。另外,阅读Wikipedia section on sizeof
,它表示sizeof
对这两个人的行为有所不同。
为什么它们都存在而不只是一个? (他们的用例是否太不相同?)
此外,其他相关行为对于每个行为都有所不同?
答案 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];
}