如何解决为什么没有指定大小的数组后跟结构中的另一个字段?
像这样的结构有效:
struct a {
char b;
int array[];
};
但是如果我像这样将char b;
放在int array[];
之后:
struct a {
int array[];
char b;
};
它给了我一个错误,更具体地说是“结构'a'具有非法的零尺寸数组”。 为什么只有在顺序相反时才出现此错误?
解决方法
C标准说,只有结构的最后一个成员可以是柔性数组,其根本原因是,由于未知柔性数组的大小,因此无法在柔性数组之后为任何成员分配位置。
通过为结构的基本大小分配内存以及为数组成员分配的额外内存,为灵活的数组成员提供内存。编译器在翻译程序时不知道此额外内存的数量,因此它无法知道数组后成员的位置。因此它无法与此类成员组成一个结构。
,通常数组必须具有大小,在结构中,大小甚至必须是编译时常量(在结构中不可能使用可变长度数组)。
但是有一个例外:Flexible array members,这是第一种结构所使用的。一个结构只能有一个柔性数组成员,并且必须始终将其放置为结构的最后一个成员。
,C允许将未指定大小的数组作为结构的最后一个成员。这称为灵活数组成员。
您可以通过为结构动态分配内存以及最后一个成员想要的许多数组元素来利用此功能。例如:
struct a *my_a = malloc(sizeof(*my_a) + 5 * sizeof(int));
这将为struct a
的实例分配空间,该实例具有array
的5个成员。
如果除最后一个成员以外的任何成员具有未指定的数组大小,则将其视为语法错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。