I hit some code in Linux kernel:

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,
    },
    { }
};

这里的 struct 数组以{ }结尾.它的目的是什么

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

推荐答案

这个特殊的更改是Eric W.Biederman的sysctl net: Remove unused binary sysctl code提交的一部分,它将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++相关问答推荐

*p[num]和(*p)num的区别

C:scanf(%d&q;,...)输入只有一个减号

我可以在C中声明不同长度数组的数组而不带变量名吗?

初始变量重置后,char[]的赋值将消失

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

每次除以或乘以整数都会得到0.0000

For循环中的变量行为不符合预期.[C17]

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

正数之和是负数

For循环不会迭代所有字符串字符吗?(初学者问题)

C:如何将此代码转换为与数组一起使用?

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

当用C打印过多的';\n';时输出不正确

赋值两侧的后置增量,字符指针

我正在使用c学习数据 struct ,在学习堆栈时,我试图将中缀转换为后缀,并编写了这段代码.代码未给出输出

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

我错误地修复了一个错误,想了解原因

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?

为什么变量突然变成0了?(c语言)