C:flexible array member not at end of struct

C语言规定,结构体内的灵活数组成员必须位于结构体的末尾。这是因为灵活数组的内存大小未知,需要在结构体之外额外分配,放在末尾能让编译器计算其他成员的固定偏移量。如果允许在中间,会导致内存布局和访问问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:https://www.coder.work/article/1567370

我的结构看起来像这样:

typedef struct storage {
    char ***data;

    int lost_index[];
    int lost_index_size;

    int size;
    int allowed_memory_key_size;
    int allowed_memory_value_size;
    int memory_size;
    int allowed_memory_size; 

} STORAGE;

我得到的错误是“错误:灵活的数组成员不在结构的末尾”。我知道这个错误可以通过在结构的末尾移动 int lost_index[] 来解决。但是为什么灵活的数组成员需要在结构的末尾?什么是原因?

因为这被认为是另一个问题的重复,实际上我没有找到我真正需要的答案,类似问题中的答案没有描述编译器抛出我询问的错误的原因。

最佳答案:

与函数参数中的数组声明不同,声明为 struct 或 union 的一部分的数组必须指定大小(有一个异常exception情况如下所述)。这就是为什么声明

int lost_index[];
int lost_index_size;

不正确。

此规则的异常(exception)是所谓的“灵活数组成员”,它是在 struct 末尾声明的没有大小的数组。您必须将它放在 struct 的末尾,以便它的内存可以与 struct 本身一起分配。这是编译器知道所有数据成员的偏移量的唯一方法。

如果编译器允许在 struct 中间使用灵活数组,则成员的位置以 size、allowed_memory_key_size 和打开,将取决于您分配给 lost_index[] 数组的内存量。此外,编译器将无法在必要时填充 struct 以确保正确的内存访问。

关于c - 错误 : flexible array member not at end of struct,
我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37164358/


本人遇到的问题:我的结构是这样的

struct taskQueue {
	int size;//任务队列能够容纳多少人
	int count;//当前队列已有的人数
	int head;//头指针
	int tail;//尾指针
	void *data[];//模拟任务
	pthread_mutex_t mutex;
	pthread_cond_t cond;
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值