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

Der*_* Si 43 c linux

当我查看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];
};
Run Code Online (Sandbox Code Playgroud)

注意最后一个变量"supervisor_stack",它是一个零长度数组,它的用法是什么?提前致谢!

Dan*_*her 38

它是灵活阵列成员的C99前版本,由GCC作为扩展提供.

C99的方法是用空括号定义柔性阵列成员,

__u8  supervisor_stack[];
Run Code Online (Sandbox Code Playgroud)

它用于存储数量不等于结构的数据.内存在表单中分配

struct foo *ptr = malloc(sizeof *ptr + whatever_is_needed);
Run Code Online (Sandbox Code Playgroud)

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

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这被称为灵活的阵列成员.在大多数情况下,将忽略灵活数组成员.特别地,结构的尺寸好像省略了柔性阵列构件,除了它可以具有比省略意味着更多的拖尾填充.但是,当一个.(或->)运算符有一个左操作数(指向一个具有灵活数组成员的结构)和右操作数命名该成员时,它的行为就好像该成员被替换为最长的数组(具有相同的元素类型)不会使结构大于被访问的对象; 数组的偏移量应保持为灵活数组成员的偏移量,即使这与替换数组的偏移量不同.如果这个数组就没有的元素,它的行为就好像它有一个元素,但如果任何试图访问该元素或产生一个指向一个过去,它的行为是不确定的.


Nap*_*s62 10

声明可以称为可变长度数组(在此处定义分配时的大小)是一种常见的C hack

例:

struct line {
   int length;
   char contents[0];
 };

 struct line *thisline = (struct line *)
   malloc (sizeof (struct line) + this_length);
 thisline->length = this_length;
Run Code Online (Sandbox Code Playgroud)

这样,您就可以对数据进行结构定义,这也可以存储数组长度以实现明显的便利性,但是您不会受到通常与结构相关联的固定大小的限制.

这里取的示例 (还有更多信息)