c - 在 C99 中空白初始化结构数组

标签 c struct initialization c99

这似乎是我知识中的一个漏洞。据我所知,在 C99 中,如果您初始化 struct 的单个元素而不初始化其他元素,则其他元素初始化为零。不过,以下代码是否将 struct 的所有成员初始化为零?

typedef struct
{
    int foo;
    int bar;
    char* foos;
    double dar;
} some_struct_t;

some_struct_t mystructs[100] = {};

更新:有一些评论表明此语法是一个扩展。如果是这样,是否有任何完全符合 C99 标准的方法?

最佳答案

根据 C11,第 6.7.9 章,初始化语法,(为了完整起见,在 C99 的第 6.7.8 章中也提到了同样的内容)

initializer:

      assignment-expression
      { initializer-list }
      { initializer-list , }

initializer-list:
      designationopt initializer
      initializer-list , designationopt initializer

designation:
      designator-list =

designator-list:
      designator
      designator-list designator

designator:
      [ constant-expression ]
      . identifier

这意味着,大括号闭合的初始化列表应该至少有一个初始化元素(对象)。

在你的代码中,空的初始化列表

 some_struct_t mystructs[100] = {};  //empty list

不是有效的纯 C 语法;它是一个编译器扩展。

您需要在列表中提及单个元素以使其符合标准,例如

some_struct_t mystructs[100] = {0};

符合标准,来自相同标准的第 21 段,

If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

因此,在这种情况下,您有一个显式 0 和剩余的隐式零初始化(或类似的)。

关于c - 在 C99 中空白初始化结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41889489/

相关文章:

c - mprotect() C 中的无效参数

c - 尝试在C中通过空地址访问数据?

c - 使用 memcpy 将结构复制到堆中

c - 将 memcpy 与具有常量成员的目标结构一起使用是否合法?

c - 如何在 gdb 中的特定条件下打印变量?

C 计算输入字符数

c - 如何为 EVP_CIPHER 设置零填充?

c++ - 如何在 C 和 C++ 中定义结构之间的某种继承?

null - 如何使用 StructureMap 将 null 作为接口(interface)的默认实例传递?

tensorflow - keras自定义conv2d初始化