我回到了c / Linux。这个问题可能看起来很愚蠢,但在c#等工作之后仍然相关。
我在结构内部有一些结构,层次结构级别超过5.在这种情况下,我在显式开始时对每个结构进行初始化。我知道c没有new()方法可以帮到你。现在我想知道是否有任何工具/小部件可能会为我创建启动结构的代码。这是一项繁琐的工作,可以加快我的工作。
答案 0 :(得分:1)
如果您只想将所有内容初始化为零,则可以使用struct
初始化{0}
,0
始终将所有内容初始化为{0}
。
从C标准,6.7.8(强调我的):
20 。如果聚合或联合包含聚合或联合的元素或成员,则这些规则以递归方式应用于子聚合或包含的联合。如果子集合或包含的并集的初始值设定项以左括号开头,则由该括号括起的初始值设定项及其匹配的右括号初始化子集合或所包含的并集的元素或成员。否则,仅从列表中获取足够的初始值设定项以考虑子集合的元素或成员或所包含的并集的第一个成员;任何剩余的初始值设定项都用于初始化当前子聚合或包含的union所属的聚合的下一个元素或成员。
21 。如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同。
简单来说,struct foo bar = { 0 };
是任何聚合类型的正确初始化程序。因此,bar
将0
的第一个元素初始化为gcc
,其余元素以递归方式初始化为各自的零值。
如果要将成员初始化为非零值,则可能需要编写函数。请注意,“零”值对于每种数据类型都是正确的。对于指针和/或浮点值,这可能不是全位零。
如果您没有“足够的”大括号,默认情况下,-Wall
-Wno-missing-braces
选项会{{1}}选项,但如果您知道自己在做什么,则警告是无害的。您可以使用{{1}} 停用该功能
答案 1 :(得分:1)
您可以使用 calloc 功能将所有内存初始化为零。
calloc()为一个内存分配内存 大小字节的nmemb元素数组 每个并返回一个指针 分配内存。内存已设置 为零。