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

cst*_*sta 20 c malloc struct

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

结构是,

typedef struct {
  size_t N;
  double data[];
  int label[];
} s_col; 
Run Code Online (Sandbox Code Playgroud)

而对malloc的调用是,

col = malloc(sizeof(s_col) + lc * (sizeof(double) + sizeof(int)));
Run Code Online (Sandbox Code Playgroud)

这是对malloc的正确调用吗?

Jer*_*fin 22

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

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

struct my_pair { 
    double data;
    int label;
};

typedef struct { 
   size_t N;
   struct my_pair data_label[];
};
Run Code Online (Sandbox Code Playgroud)

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

  • @EricPostpischil:从具有两个灵活数组成员的结构声明开始的人只需要意识到这是不允许的,而不是引用禁止它的标准的特定部分。相信我,我已经多次引用了该标准(如果您不相信,请随意浏览我的帖子)。但我非常确定,在这种情况下这样做只会分散注意力,而不是提供信息。 (2认同)

sup*_*cat 11

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


J-1*_*DiZ 5

typedef struct {
  size_t N;
  double data[];
  int label[];
} s_col; 
Run Code Online (Sandbox Code Playgroud)

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

  • @lukasz1985:您所说的在函数参数的上下文中是正确的,您可以在其中指定“数组操作参数”,这在技术上是通过指针实现的。通常(即这里)数组是数组,指针是指针。 (2认同)