Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-结构数组初始化中空终止符的含义_C_Linux Device Driver_Device Tree - Fatal编程技术网

C-结构数组初始化中空终止符的含义

C-结构数组初始化中空终止符的含义,c,linux-device-driver,device-tree,C,Linux Device Driver,Device Tree,在查看PCIe驱动程序时,我看到了这种类型的结构阵列初始化 static struct pci_device_id DWC_ETH_QOS_id[] = { { PCI_DEVICE(VENDOR_ID, DEVICE_ID), }, { }, } 我在\u device\u id的设备树中也发现了类似的代码: static const struct of_device_id rh850_match_table[] = { { .compatible = "renesa

在查看PCIe驱动程序时,我看到了这种类型的结构阵列初始化

static struct pci_device_id DWC_ETH_QOS_id[] = {
    { PCI_DEVICE(VENDOR_ID, DEVICE_ID), },
    { },
}
我在\u device\u id的设备树中也发现了类似的代码:

static const struct of_device_id rh850_match_table[] = {
    { .compatible = "renesas,rh850" },
    { }
};
为什么结尾有一个空的{}


谢谢你的帮助

ISO C语法要求初始值设定项列表为非空,但某些编译器(如GCC)允许这样做

下面是关于这个话题的一个例子

如果它是空的(如果没有={…}部分,你会得到零的结果),那么答案是“如果对象有静态持续时间,那么是,如果没有,那么是”


就我个人而言,我用我知道的值初始化,而不依赖于未定义的行为。这可能会限制代码的可移植性,但我怀疑这在这种做法很常见的社区(Linux驱动程序,其中GCC是默认编译器)中不是一个问题。

ISO C语法要求初始值设定项列表为非空,但是,一些编译器(例如GCC)允许这样做

下面是关于这个话题的一个例子

如果它是空的(如果没有={…}部分,你会得到零的结果),那么答案是“如果对象有静态持续时间,那么是,如果没有,那么是”


就我个人而言,我使用我知道的值进行初始化,并且不依赖于未定义的行为。这可能会限制代码的可移植性,但我怀疑在这种做法很常见的社区中,这不是一个问题(在Linux驱动程序中,GCC是默认的编译器。

正如@underline\u d指出的,{}作为sentinel元素添加,以便在这些数组上循环的代码知道何时停止。它依赖于最后一个“空”sentinel元素作为终止条件

依赖于sentinel元素的代码:

设备id表的结构:

结构pci_设备_id:

正如@underline\u d指出的,{}被添加为一个sentinel元素,以便在这些数组上循环的代码知道何时停止。它依赖于最后一个“空”sentinel元素作为终止条件

依赖于sentinel元素的代码:

设备id表的结构:

结构pci_设备_id:

其他代码可能会在不知道数组大小的情况下获取指向数组的指针,并且需要在末尾使用一个空的sentinel元素,以便知道它何时必须停止读取。读取使用这些元素的代码可能会显示这一点。我明白你的意思:可能其他代码在不知道数组大小的情况下获取指向数组的指针,并且需要一个空的sentinel元素sentinel元素,以便知道何时必须停止读取。读取使用这些元素的代码可能会表明这一点。我明白你的观点:未初始化的元素不是都得到默认初始化吗?在C中,这意味着零?如果初始化器没有为所有元素/成员提供值,则剩余的元素/成员都是默认的已初始化,无论对象是否为静态。标准不提供
{}
,但可能会应用相同的规则。@KeithThompson如果至少有一个成员变量已显式初始化,则
{}
对于数组成员变量可能是真的?@Observer:不确定你在问什么。C没有指定
{}的语义
,但我们可以做出合理的推断。在您链接的讨论中,我没有看到任何关于空初始值设定项的讨论。这里是一个真实的讨论:答案确实是否定的。未初始化的元素不是都得到默认初始化,这在C中表示为零?如果初始值设定项没有为所有元素/成员提供值,则剩余的元素/不管对象是否是静态的,成员都是默认初始化的。标准没有提供
{}
,但可能会应用相同的规则。@KeithThompson如果至少有一个成员变量被显式初始化,则
{}
对于数组成员变量可能是正确的?@Observer:不确定你在问什么。C没有指定
{}
的语义,但我们可以做出合理的推断。在你链接的讨论中,我没有看到任何关于空初始化器的讨论。这是一个真实的问题:答案确实是否定的。