【问题标题】:What is the cause of flexible array member not at end of struct error?灵活数组成员不在结构错误末尾的原因是什么?
【发布时间】:2012-06-24 19:05:51
【问题描述】:

我想知道为什么我在调用 malloc 时总是收到 error: flexible array member not at end of struct 错误。我有一个带有可变长度数组的结构,并且一直收到此错误。

结构是,

typedef struct {
  size_t N;
  double data[];
  int label[];
} s_col; 

对 malloc 的调用是,

col = malloc(sizeof(s_col) + lc * (sizeof(double) + sizeof(int)));

这是对 malloc 的正确调用吗?

【问题讨论】:

    标签: c struct malloc


    【解决方案1】:

    一个结构体中只能有一个灵活的数组成员,并且它必须始终是结构体的最后一个成员。换句话说,在这种情况下,您在调用malloc 之前就出错了,以至于实际上无法为这个结构正确调用malloc。

    要做你想做的事(data 和 label 成员数量相同的数组),你可以考虑这样的事情:

    struct my_pair { 
        double data;
        int label;
    };
    
    typedef struct { 
       size_t N;
       struct my_pair data_label[];
    };
    

    请注意,这有点不同:不是doubles 数组后跟ints 数组,而是提供一个double 后跟一个int 的数组,然后是下一个double,下一个 int,依此类推。这是否足够接近相同取决于您使用数据的方式(例如,要传递给需要连续数组的外部函数,您可能必须以不同的方式做事)。

    【讨论】:

    • 奇怪的是,这个投票赞成的答案并不能很好地回答这个问题:“什么是原因......”它说明了一个规则(一个灵活的数组成员只能是最后一个),但它没有给出一个规则的来源(C 2011/2018 6.7.2.1 18)或原因(无法确定后续成员的位置,因为编译器不知道灵活数组的起始时间)。
    • @EricPostpischil:从具有两个灵活数组成员的结构声明开始的人只需要意识到这是不允许的,而不是引用标准中禁止它的特定部分。相信我,我已经引用了很多 次有意义的标准(如果您不相信,请随意查看我的帖子)。但我很确定,在这种情况下这样做只会分散注意力,不会通知。
    【解决方案2】:

    给定一个结构定义和一个指向结构开头的指针,C 编译器必须能够访问该结构的任何成员,而无需访问其他任何内容。由于结构中每个项目的位置由其前面的项目的数量和类型决定,因此访问任何项目都需要知道所有前面项目的数量和类型。在最后一项是数组的特殊情况下,这并没有特别困难,因为访问数组中的一项需要知道它从哪里开始(这需要知道 前面的项的数量和类型,而不是数组本身中的项目数)和项目索引(编译器可能假设它小于存在空间的项目数,而不必知道有关数组大小的任何信息)。但是,如果灵活数组成员出现在结构末尾以外的任何位置,则其后面的任何项的位置将取决于数组中的项数——编译器不会知道这一点。

    【讨论】:

      【解决方案3】:
      typedef struct {
        size_t N;
        double data[];
        int label[];
      } s_col; 
      

      你不能拥有 中间的灵活数组成员(double data[])。考虑硬编码数组大小或double *data

      【讨论】:

      • 我不明白,我听说“T* var”和“T var[]”是一样的
      • @lukasz1985:您所说的在函数参数的上下文中是正确的,您可以在其中指定“数组操作参数”,这在技术上是通过指针实现的。通常(即这里)数组是一个数组,而指针是一个指针。
      猜你喜欢
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      相关资源
      最近更新 更多