作者:mobiledu2502914997 | 来源:互联网 | 2023-05-19 06:09
我想知道为什么我不断收到error:flexiblearraymembernotatendofstruct当我调用malloc时error:flexiblearraymembern
我想知道为什么我不断收到error: flexible array member not at end of struct
当我调用malloc时error: flexible array member not at end of struct
错误的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的正确调用吗?
在结构中只能有一个灵活的数组成员,并且它必须始终是结构的最后一个成员。 换句话说,在这种情况下,在调用malloc
之前就已经出错了,以至于没有办法正确地为这个结构调用malloc
。
要做你想要的(相同数量的data
和label
成员的数组),你可以考虑这样的事情:
struct my_pair { double data; int label; }; typedef struct { size_t N; struct my_pair data_label[]; };
请注意,这有点不同:它不是一个double
的数组,后跟一个int
数组,它给你一个数组,一个double
后跟一个int
,然后是下一个double
,next int
,依此类推。 这是否足够接近相同或者取决于你如何使用数据(例如,为了传递到需要连续数组的外部函数,你可能不得不以不同的方式做事)。
typedef struct { size_t N; double data[]; int label[]; } s_col;
中间不能有灵活的数组成员( double data[]
)。 考虑硬编码数组大小或double *data
给定结构定义和指向结构开头的指针,C编译器必须能够访问结构的任何成员而无需访问任何其他内容。 由于结构内每个项目的位置由其前面的项目的数量和类型确定,因此访问任何项目需要知道所有在前项目的数量和类型。 在最后一项是数组的特定情况下,这没有特别的困难,因为访问数组中的项需要知道它的起始位置(这需要知道前面项的数量和类型,而不是数组中的项数本身)和项目索引(编译器可能假定它小于空间存在的项目数,而不必知道有关数组大小的任何信息)。 但是,如果一个Flexible Array成员出现在结构的末尾以外的任何地方,那么跟随它的任何项的位置将取决于数组中的项数 – 编译器不会知道。
需要了解更多c/c++开发分享灵活数组成员不在结构错误结束时的原因是什么?,也可以关注C/ C++技术分享栏目—编程笔记
以上就是c/c++开发分享灵活数组成员不在结构错误结束时的原因是什么?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(编程笔记)。