我有以下结构:
struct node {
int data;
struct node *next;
};
struct node *n1 = malloc(sizeof(struct node));
我不确定如何将struct指针的所有指针字段初始化为NULL而不会导致任何内存泄漏?
答案 0 :(得分:4)
使用malloc
分配结构后,需要初始化结构成员:
struct node {
int data;
struct node *next;
};
struct node *n1 = malloc(sizeof(struct node));
n1->data = 0;
n1->next = NULL;
如果要使用默认值一步初始化结构,如果它更大,则可以使用具有这些defaut值的静态结构:
struct node def_node = { 0, NULL };
struct node *n1 = malloc(sizeof(struct node));
*n1 = def_node;
或者,您可以使用C99语法:
struct node *n1 = malloc(sizeof(struct node));
*n1 = (struct node){ 0, NULL };
正如Leushenko所评论的,您可以将初始值设定项缩短为{ 0 }
,以便将所有成员初始化为其类型的适当零:
struct node *n1 = malloc(sizeof(struct node));
*n1 = (struct node){ 0 };
答案 1 :(得分:3)
您有四种选择:
1)手动设置指针,例如node-> next = NULL;
2)分配时使用calloc()将内存清零
3)在分配内存后,使用memset()将内存清零。
...或......
4)在实际需要使用struct之前,不要担心显式初始化。设计程序,确保在尝试读取指针之前指定任何指针。
仅供参考,这是C ++或C#等OO语言中“构造函数”的主要目的之一:初始化"class invariants"。
PS:
5)我忘了C99结构初始化,Leushenko提到:
what is the difference between struct {0} and memset 0
struct A
{
int x;
int y;
};
...
A a = {0};
calloc()或memset()。
除了“0”之外,它还适用于其他初始化值:
C99标准6.7.8.21
如果括号括起的列表中的初始值设定项少于此值 是聚合的元素或成员,或者是一个或多个字符 string literal用于初始化已知大小的数组 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间。