【问题标题】:error: flexible array member not at end of struct错误:灵活的数组成员不在结构的末尾
【发布时间】:2016-09-06 22:57:14
【问题描述】:

我的结构看起来像这样:

typedef struct storage {
    char ***data;

    int lost_index[];
    int lost_index_size;

    int size;
    int allowed_memory_key_size;
    int allowed_memory_value_size;
    int memory_size;
    int allowed_memory_size; 

} STORAGE;

我得到的错误是“错误:灵活数组成员不在结构末尾”。我知道这个错误可以通过在结构末尾移动int lost_index[] 来解决。为什么灵活的数组成员需要位于结构的末尾?原因是什么?

由于这被假定为另一个问题的重复,实际上我没有找到我真正需要的答案,类似问题中的答案没有描述 reason 在编译器后面抛出我询问的错误。

谢谢

【问题讨论】:

  • @pytheos 不是。这个问题询问其设计方式背后的原因。 :)
  • 在那个答案中我没有找到解释,为什么它会导致,是什么让编译器抛出这个错误。
  • @StrahinjaDjurić,实际上最后一个答案包含您需要的所有信息。
  • 编译器标记错误,因为语言要求成员位于末尾,并且编译器遵循语言规则。现在的问题应该是:“为什么语言需要它?”

标签: c arrays struct


【解决方案1】:

与函数参数中的数组声明不同,声明为structunion 的一部分的数组必须指定一个大小(除了下面描述的一个例外)。这就是为什么声明

int lost_index[];
int lost_index_size;

不正确。

这个规则的例外是所谓的“灵活数组成员”,它是一个在struct 末尾没有大小声明的数组。您必须将它放在struct 的末尾,以便它的内存可以与struct 本身一起分配。这是编译器知道所有数据成员偏移量的唯一方法。

如果编译器允许在struct 中间使用灵活数组,则以sizeallowed_memory_key_size 等开头的成员的位置将取决于您分配给@ 的内存量987654330@ 数组。此外,编译器将无法在必要时填充struct 以确保正确的内存访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2011-03-04
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多