什么是在结构中的零长度数组的目的?

当我在看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]; }; 

注意最后一个variables“supervisor_stack”,它是一个长度为零的数组,它的用法是什么? 提前致谢!

这是一个灵活的数组成员的C99之前版本,由GCC作为扩展提供。

C99的方法是用空括号定义灵活的数组成员,

 __u8 supervisor_stack[]; 

它用来存储数量与结构不连续的数据。 内存分配的forms

 struct foo *ptr = malloc(sizeof *ptr + whatever_is_needed); 

在6.7.2.1的第18段中,标准(草案N1570)描述了这些标准:

作为特殊情况,具有多个名称成员的结构的最后一个元素可能具有不完整的数组types; 这被称为一个灵活的数组成员。 在大多数情况下,灵活的数组成员被忽略。 特别是,结构的大小就好像是柔性arrays成员被省略,除了它可能具有比省略暗示的更多的尾部填充。 但是,当一个. (或-> )运算符的左操作数是(指向)一个具有灵活数组成员的结构,右操作数指定该成员,它的行为就好像该成员被replace为最长的数组(具有相同的元素types)不会使结构大于被访问的对象; 数组的偏移量应保持为可变数组成员的偏移量,即使这与replace数组的偏移量不同。 如果这个数组没有元素,就像它有一个元素一样,但是行为是不确定的,如果试图访问那个元素或者生成一个指向它的指针。

声明什么可以称为可变长度数组(在分配时定义大小)是一种常见的C破解方法

例:

 struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length; 

这样你就有了一个你的数据的结构定义,它也存储数组的长度,以达到明显的舒适目的,但是你不受通常与一个结构关联的固定大小的限制

从这里取得的例子(也有更多的信息在那里)