灵活数组成员不在结构错误结束时的原因是什么?

时间:2012-06-24 19:05:52

标签: c struct malloc

我想知道为什么我在调用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的正确调用吗?

3 个答案:

答案 0 :(得分:22)

结构中只能有一个灵活的数组成员,并且它必须始终是结构的最后一个成员。换句话说,在这种情况下,你在调用malloc之前就已经出错了,甚至没有办法正确地为这个结构调用malloc

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

struct my_pair { 
    double data;
    int label;
};

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

请注意,这有点不同:它不是一个double的数组,后跟一个int数组,它会为您提供一个double后跟一个{的数组{ {1}},然后是下一个int,下一个double,依此类推。这是否足够接近相同或者取决于你如何使用数据(例如,为了传递给期望连续数组的外部函数,你可能不得不以不同的方式做事。)

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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