繁体   English   中英

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

[英]How to initialize all the pointer fields of struct pointer to NULL?

我有以下结构:

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


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

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

使用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)手动设置指针,例如node-> next = NULL;

2)分配时使用calloc()将内存清零

3)使用memset()在分配内存后将其清零。

... 要么 ...

4)在实际需要使用struct之前,不要担心显式初始化。 设计程序,确保在尝试读取之前指定任何指针。

仅供参考,这是OO语言(如C ++或C#)中“构造函数”的主要目的之一:初始化“类不变量”

PS:

5)我忘记了C99结构初始化,Leushenko提到:

struct {0}和memset 0之间有什么区别

struct A
{
    int x;
    int y;
};
...
A a = {0};

这是大大优选的要么释放calloc()或memset的()。

它也适用于“0”以外的其他初始化值:

C99标准6.7.8.21

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM