如何将struct指针的所有指针字段初始化为NULL?

时间:2016-01-23 01:08:50

标签: c pointers struct

我有以下结构:

 struct node {
    int data;
    struct node *next;
};


struct node *n1 = malloc(sizeof(struct node));

我不确定如何将struct指针的所有指针字段初始化为NULL而不会导致任何内存泄漏?

2 个答案:

答案 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用于初始化已知大小的数组   是数组中的元素,聚合的其余部分应为   隐式初始化与具有静态存储的对象相同   持续时间。