使用NULL值初始化结构

mat*_*u_b 1 c struct null-pointer

我初始化这个结构时遇到问题:

struct node {
    int label;
    struct node *lchild;
    struct node *rchild;
}

int main(void) {
    struct node n1;
    n1.label = 1;

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

问题是我的成员lchild,rchild并没有指向NULL.

我可以通过添加来解决问题

n1.lchild = NULL;
n1.rchild = NULL;
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么我需要这样做?

alk*_*alk 7

我不明白为什么我需要这样做

因为编译器不会为你做这件事.

如果您可以确保在写入之前未读取成员,则可以跳过此步骤.


jua*_*nza 6

自动存储对象的成员,例如n1不会自动进行零初始化(参见C11标准,6.7.9.10).你必须自己做.

您可以通过适当的初始化轻松地处理这个问题n1:

struct node n1 = {1};
Run Code Online (Sandbox Code Playgroud)

这将设置第一个成员1并将其余部分初始化,这意味着指针初始化为NULL.如果您愿意,您可以更明确:

struct node n1 = {1, NULL, NULL};
Run Code Online (Sandbox Code Playgroud)

参考文献:

从C11标准开始,6.7.9初始化:

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

而且,之前在同一部分,

  1. ...如果没有显式初始化具有静态或线程存储持续时间的对象,则:
    - 如果它具有指针类型,则将其 初始化为空指针 ;

(强调我的)

  • `= {1}`很好:N1570 6.7.9.21*"如果括号括起的列表中的初始值设定项少于聚合的元素或成员,......,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同."* (2认同)