c - 结构数组末尾的空大括号 '{ }' 需要什么?

标签 c arrays struct linux-kernel

我打了一些 code在 Linux 内核中:

static struct ctl_table ip_ct_sysctl_table[] = {
    {
        .procname   = "ip_conntrack_max",
        .maxlen     = sizeof(int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec,
    },
    // ...
    {
        .procname   = "ip_conntrack_log_invalid",
        .maxlen     = sizeof(unsigned int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec_minmax,
        .extra1     = &log_invalid_proto_min,
        .extra2     = &log_invalid_proto_max,
    },
    { }
};

这里的结构数组以 { } 结尾.添加的目的是什么?
顺便说一句,在这段代码上方还有一个 array of structs ,但最后没有空括号。

什么时候应该在结构数组的末尾使用空大括号?

最佳答案

此特定更改是 sysctl net: Remove unused binary sysctl code 的一部分由 Eric W. Biederman 提交,更改 ip_ct_sysctl_table 最后一个元素的初始化来自 {0} 的数组至 {} (并对许多其他数组初始化执行类似的更改)。
{0}模式似乎已经存在了更长时间,而且两者 {0}{}最后的元素初始化通常(在 Linux 源代码中)显式地称为 Terminating entry ,因此很可能存在一种模式,允许在不知道它们的长度的情况下使用这些数组,在点击零初始化终止条目时终止使用。例如。对于 sound/aoa/fabrics/snd-aoa-fabric-layout.c 中的类似数组甚至在评论中明确提到了零初始化的意图,例如:

static struct codec_connection toonie_connections[] = {
  {
      .connected = CC_SPEAKERS | CC_HEADPHONE,
      .codec_bit = 0,
  },
  {} /* terminate array by .connected == 0 */
};

关于c - 结构数组末尾的空大括号 '{ }' 需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60489448/

相关文章:

c - 如何读取C中的行

arrays - VueJS : observer object instead of Array

c - 错误 : expression must be a modifiable l value

c - 如何设置结构体的字符串属性?

c - 为什么我的 ip 地址 [] 被覆盖了?

c - fputs 或 fprintf 不写入字符串文件

c - 左值要求错误

javascript - 按字符串对 Javascript 对象数组进行排序

C : Load data from file to the linked list

c - 使用 read() 系统调用读取结构内容