代码之家  ›  专栏  ›  技术社区  ›  Kangkan

C/Linux中的自动结构初始化

  •  0
  • Kangkan  · 技术社区  · 15 年前

    我又回到C/Linux了。这个问题可能看起来很愚蠢,但在C等工作后却很相关。

    我在结构内部有一些结构,层次结构级别超过5级。在这种情况下,我将在开始时显式地对每个结构进行初始化。我知道C没有一个新的()方法可以为您实现它。现在我想知道是否有任何工具/小部件可以为我创建启动结构的代码。这是一项枯燥的工作,可以加速我的工作。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Alok Singhal    15 年前

    如果您只想将所有内容初始化为零,则可以初始化 struct 具有 {0} ,它总是将所有内容初始化为 0 .

    根据C标准6.7.8(重点矿山):

    二十 . 如果聚合或联合包含聚合或联合的元素或成员, 这些规则递归应用 到子集合或包含的联合。如果子聚合或包含的联合的初始值设定项以左大括号开头,则由该大括号及其匹配的右大括号括起的初始值设定项将初始化子聚合或包含的联合的元素或成员。否则,仅考虑列表中足够的初始值设定项来考虑子聚合的元素或成员或包含的联合的第一个成员;剩下的任何初始值设定项都将用于初始化当前子聚合或包含的联合所属的聚合的下一个元素或成员。

    21岁 . 如果括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则应隐式初始化聚合的其余部分,与具有静态存储持续时间的对象相同。

    简而言之, { 0 } 是任何聚合类型的正确初始值设定项。所以, struct foo bar = { 0 }; 初始化的第一个元素 bar ,其余部分递归初始化为各自的零值。

    如果要将成员初始化为非零值,则可能需要编写函数。请注意,“零”值对于每种数据类型都是正确的。对于指针和/或浮点值,这可能不是全部为零位。

    gcc 具有 -Wall 默认情况下,如果您没有足够的大括号,选项会发出警告,但是如果您知道自己在做什么,警告是无害的。您可以用禁用 -Wno-missing-braces

        2
  •  1
  •   Pavunkumar    15 年前

    你可以使用 分配 函数将所有内存初始化为零。

    calloc()为 字节大小的nmemb元素数组 并返回指向 分配的内存。内存已设置 到零。