首页 文章

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

提问于
浏览
3

我在ISO C99 committee draft中看到结构可能有一个不完整的数组,其大小未指定,称为Flexible Array Member .

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

我认为FAM是一种特殊的VLA,但我看到两个SO用户声称不然 . 另外,阅读Wikipedia section on sizeof,它表示 sizeof 对于那两个表现不同 .

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

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

1 回答

  • 5

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

    Flexible array members. 这意味着结构可以在末尾具有未知大小的成员 . 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之前,结构末尾可能会出现意外的填充字节,从而导致错误 .

    Variable length arrays (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

相关问题