vil*_*asv 3 c c99 variable-length-array flexible-array-member
我已经在ISO C99委员会草案中看到,结构可能有一个不完整的数组,其末端具有未指定的大小,称为Flexible Array Member.
另一方面,C99还具有可变长度数组,它允许在编译时声明大小不恒定的数组.
我认为FAM是一种特殊的VLA,但我看到有两个SO用户声称不是.此外,阅读维基百科部分sizeof,它表示这sizeof两者的行为不同.
为什么它们都存在而不只是一个?(他们的用例太不一样了吗?)
此外,哪些其他相关行为对于每个行为都不同?
C99标准添加了两个不同的东西,它们容易混淆错误:
灵活的阵列成员.这意味着结构可以在末尾具有未知大小的成员.C标准示例:
struct s { int n; double d[]; };
int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
Run Code Online (Sandbox Code Playgroud)
这也是在C99之前使用的,但它是未定义的行为,被称为另一个答案中提到的"struct hack".在C90之前,结构末尾可能会出现意外的填充字节,从而导致错误.
可变长度数组(VLA).这些是在运行时设置其大小的数组.它们很可能是由编译器通过使用动态内存分配来实现的.例:
void func (int n)
{
int array[n];
}
Run Code Online (Sandbox Code Playgroud)
来自user29079:https://softwareengineering.stackexchange.com/questions/154089/c-flexible-arrays-when-did-they-become-part-of-the-standard