结构中零长度数组的用途是什么?[重复]
- 2024-10-24 08:50:00
- admin 原创
- 64
问题描述:
当我查看 Linux 内核代码时,发现了以下代码:
struct thread_info {
struct task_struct *task;
struct exec_domain *exec_domain;
unsigned long flags;
__u32 status;
__u32 cpu;
int preempt_count;
mm_segment_t addr_limit;
struct restart_block restart_block;
void __user *sysenter_return;
unsigned long previous_esp;
__u8 supervisor_stack[0];
};
注意最后一个变量“supervisor_stack”,它是一个零长度数组,它有什么用处?提前致谢!
解决方案 1:
它是灵活数组成员的 C99 之前版本,由 GCC 作为扩展提供。
C99 的方式是用空括号定义灵活数组成员,
__u8 supervisor_stack[];
它用于存储与结构连续的非恒定量数据。内存分配形式为
struct foo *ptr = malloc(sizeof *ptr + whatever_is_needed);
在6.7.2.1的第18段中,标准(草案N1570)对其进行了描述:
作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,灵活数组成员将被忽略。具体而言,结构的大小就像省略了灵活数组成员一样,只是它可能具有比省略所暗示的更多的尾随填充。但是,当
.
(或->
) 运算符的左操作数是(指向)具有灵活数组成员的结构的指针并且右操作数命名该成员时,它的行为就像该成员被最长的数组(具有相同的元素类型)替换一样,这不会使结构大于正在访问的对象;数组的偏移量应保持为灵活数组成员的偏移量,即使这与替换数组的偏移量不同。如果此数组没有元素,它的行为就像它有一个元素一样,但如果尝试访问该元素或生成一个超过它的指针,则行为是未定义的。
解决方案 2:
声明可变长度数组(在分配时定义大小)是一种常见的 C 语言 hack
例子:
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)
malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
这样,您就有了数据的结构定义,它还存储了数组长度,以方便使用,但您不受通常与结构相关联的固定大小的限制
示例取自此处 (其中还有更多信息)
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD