我想知道为什么我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
正确地为这个结构调用.
要做你想要的事情(相同数量data
和label
成员的数组),你可以考虑这样的事情:
struct my_pair {
double data;
int label;
};
typedef struct {
size_t N;
struct my_pair data_label[];
};
Run Code Online (Sandbox Code Playgroud)
请注意,这有点不同:它不是一个double
s 数组,后跟一个int
s 数组,它给你一个数组,double
后跟一个int
,然后是下一个double
,下一个int
,依此类推.这是否足够接近相同或者取决于你如何使用数据(例如,为了传递给期望连续数组的外部函数,你可能不得不以不同的方式做事).
sup*_*cat 11
给定一个结构体定义和一个指向结构体开头的指针,C 编译器必须能够访问该结构体的任何成员而无需访问其他任何东西。由于每个项目在结构中的位置由它前面的项目的数量和类型决定,因此访问任何项目都需要知道所有前面项目的数量和类型。在最后一项是数组的特殊情况下,这不会带来特别困难,因为访问数组中的一项需要知道它从哪里开始(这需要知道前面的项目的数量和类型)项,而不是数组本身中的项数)和项索引(编译器可能会假设它小于存在空间的项数,而无需了解有关数组大小的任何信息)。但是,如果灵活数组成员出现在结构末尾以外的任何位置,则其后的任何项目的位置将取决于数组中项目的数量——这是编译器不会知道的。
typedef struct {
size_t N;
double data[];
int label[];
} s_col;
Run Code Online (Sandbox Code Playgroud)
double data[]
中间不能有灵活的数组成员 ( )。考虑硬编码数组大小或double *data