35

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

结构是,

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

对 malloc 的调用是,

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

这是对 malloc 的正确调用吗?

4

3 回答 3

34

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

要执行您似乎想要的操作(具有相同数量datalabel成员的数组),您可以考虑以下内容:

struct my_pair { 
    double data;
    int label;
};

typedef struct { 
   size_t N;
   struct my_pair data_label[];
};

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

于 2012-06-24T19:08:05.483 回答
12

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

于 2013-12-02T19:23:33.523 回答
4
typedef struct {
  size_t N;
  double data[];
  int label[];
} s_col; 

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

于 2012-06-24T19:09:15.717 回答