C 结构体指针初始化

7

当实例化包含结构体指针数组的结构体时,是否保证结构体数组成员中的所有指针都设置为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

1个回答

17

这取决于您如何初始化结构体。

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
}

"Nothing initialized" 意味着所有成员都只有随机的垃圾值。 "Default-initialized" 意味着所有成员都将被初始化为 0,对于指针成员来说,将等同于 NULL。 "Zero-initialized" 意味着所有东西都会被设置为 0。这仅适用于 NULL 用位 0 表示的平台。


1
calloc 函数会正确地初始化 NULL 指针吗?我的意思是,全零比特 是否总是表示 NULL - cnicutar
1
我的GCC(4.6.1)在我写={0}时给了我一个“缺少初始化器”的警告。你确定这是合法的吗? - Kerrek SB
3
不是所有被赋予空指针字面量值的指针的底层表示都必须为0。这与“零初始化”不同于“零值初始化”。引用[C99:6.3.2.3 / 3]。 - Lightness Races in Orbit
3
根据网址http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options,选项`-Wextra`会启用`-Wmissing-field-initializers`,后者会对此发出警告,尽管它知道这些字段会被隐式初始化为零。 - Oliver Charlesworth
3
@Zahy:除了使用反引号格式化评论外,您不能对其进行格式化,但可以随时修改原始帖子!此外,“不定”包括可能为零的可能性-只是没有保证。 - Kerrek SB
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接