我在初始化此结构时遇到问题:
struct node {
int label;
struct node *lchild;
struct node *rchild;
}
int main(void) {
struct node n1;
n1.label = 1;
return EXIT_SUCCESS;
}
问题是我的成员lchild
和rchild
没有指向NULL。
我可以通过添加
解决问题n1.lchild = NULL;
n1.rchild = NULL;
但我不明白为什么我需要这样做?
答案 0 :(得分:7)
我不明白为什么我需要这样做
因为编译器不会为你做这件事。
如果您可以确保成员在写入之前无法阅读,则可以跳过此步骤。
答案 1 :(得分:6)
n1
等自动存储对象的成员不会自动进行零初始化(参见C11标准, 6.7.9.10 )。你必须自己做。
通过适当初始化n1
:
struct node n1 = {1};
这会将第一个成员设置为1
,并将其余部分初始化,这意味着指针会初始化为NULL
。如果您愿意,可以更明确:
struct node n1 = {1, NULL, NULL};
参考文献:
根据C11标准, 6.7.9初始化:
- 如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者更少的字符 用于初始化已知大小的数组的字符串文字 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间
醇>
而且,之前在同一部分,
- ...如果没有显式初始化具有静态或线程存储持续时间的对象,则:
醇>
- 如果它具有指针类型,则为 初始化为空指针;
(强调我的)