首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构数组末尾的空大括号“{}”需要什么?

结构数组末尾的空大括号“{}”需要什么?
EN

Stack Overflow用户
提问于 2020-03-02 13:03:02
回答 4查看 4.1K关注 0票数 60

我在Linux内核中碰到了一些C 代码

代码语言:javascript
复制
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,
    },
    { }
};

在这里,一个结构数组以{ }结尾。它是为了什么目的而增加的?

顺便说一下,在这段代码的上方还有另一个结构数组,但末尾没有空大括号。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-02 14:36:34

这个特定的更改是EricW.Biederman提交的https://github.com/torvalds/linux/commit/f8572d8f2a2ba75408b97dc24ef47c83671795d7的一部分,它将ip_ct_sysctl_table数组的最后一个元素的初始化从{0}更改为{} (并执行与许多其他数组初始化类似的更改)。

然而,{0}模式似乎已经存在了很长时间,而且{0}{}最终元素初始化通常(在Linux源代码中)都被显式地称为Terminating entry,因此很可能存在这样一种模式:允许在不知道这些数组的长度的情况下使用它们,在触及零初始化终止条目时终止消耗。例如,对于sound/aoa/fabrics/snd-aoa-fabric-layout.c中类似的数组,零初始化的意图甚至在注释中被显式地提到,例如:

静态结构codec_connection toonie_connections[] ={{ .connected = CC_SPEAKERS = CC_HEADPHONE,.codec_bit = 0,},{} /*终止数组由.connected == 0 */ };

票数 39
EN

Stack Overflow用户

发布于 2020-03-02 13:08:28

你可能很熟悉以零结尾的字符串。ctl_table ip_ct_sysctl_table[]是一个以零结尾的数组,即最后一个数组条目具有全零成员.

票数 21
EN

Stack Overflow用户

发布于 2020-03-02 15:59:45

结构数组末尾的空大括号“{}”需要什么?

需要明确的是:不需要结构数组末尾的“空大括号'{ }”来满足C语法要求。

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

当代码想要一个前哨值时。

有时,对于程序来说,有一个所有零的最终数组元素是有用的--当然是用来检测结束的。需求来自应用程序对数组ctl_table ip_ct_sysctl_table[]的使用,而不是C语言的需求。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60489448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档