【问题标题】:C struct with pointers initialization带有指针初始化的 C 结构
【发布时间】:2011-08-14 13:03:58
【问题描述】:

当一个包含结构指针数组的结构被实例化时, 我是否保证结构数组成员中的所有指针都将设置为NULL

这是一个示例结构:

typedef struct mmNode {
  int val;
  int board[2][NUM_PITS+1];
  int side;
  struct mmNode* children[NUM_PITS+1];
} mmNode;

IE:如果我创建 mmNode 结构的实例,mmNode.children 的元素是否总是设置为NULL

【问题讨论】:

    标签: c pointers struct


    【解决方案1】:

    这取决于你如何初始化你的结构。

    mmNode a;                              // Everything default-initialized
    
    void foo()
    {
        static mmNode b;                   // Everything default-initialized
    
        mmNode  c;                         // Nothing initialized
        mmNode  d = { 0 };                 // Everything default-initialized
        mmNode *p = malloc(sizeof(*p));    // Nothing initialized
        mmNode *q = calloc(1, sizeof(*q)); // Everything zero-initialized
    }
    

    “未初始化”意味着所有成员都将只有随机垃圾值。 “默认初始化”意味着所有成员都将被初始化为 0,对于指针成员,这将等同于 NULL。 “零初始化”意味着所有内容都将按位设置为 0。这仅适用于 NULL 用按位 0 表示的平台。

    【讨论】:

    • calloc 会正确初始化NULL 指针吗?我的意思是all-bits 0 总是意味着NULL 吗?
    • 当我写 = {0} 时,我的 GCC (4.6.1) 给了我一个警告“缺少初始化程序”。你确定这是合法的吗?
    • @cnicutar:不。“零初始化”与“空初始化”不同。其值被分配了空指针文字的指针的底层表示不必是0[C99:6.3.2.3/3]
    • @Kerrek:根据gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options-Wextra 启用了-Wmissing-field-initializers,尽管它承认它们被隐式初始化为零,但它会对此发出警告。
    • @Zahy:除了反引号之外,您无法格式化 cmets,但请随时修改您的原始帖子!此外,“不确定”包括为零的可能性 - 无法保证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多