Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将struct pointer的所有指针字段初始化为NULL?_C_Pointers_Struct - Fatal编程技术网

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

如何将struct pointer的所有指针字段初始化为NULL?,c,pointers,struct,C,Pointers,Struct,我有以下结构: struct node { int data; struct node *next; }; struct node *n1 = malloc(sizeof(struct node)); 我不知道如何将struct pointer的所有指针字段初始化为NULL而不造成任何内存泄漏的可能性?在使用malloc分配结构后,需要初始化结构的成员: struct node { int data; struct node *next; }; stru

我有以下结构:

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


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

我不知道如何将struct pointer的所有指针字段初始化为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) 用于在分配内存时将其归零

3) 用于在分配内存后将其归零

。。。或者

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

FYI,这是OC语言中的“构造函数”的主要目的之一,如C++或C语言:初始化。 附言:

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

这比calloc()或memset()更受欢迎

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

C99标准6.7.8.21

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


使用
calloc
而不是
malloc
n1->next=NULL有什么问题?@WeatherVane:这将适用于当前的处理器,但严格来说并不正确。如果您不喜欢calloc,您可以使用memset跟随malloc调用,这将完成同样的事情。@WeatherVane:这是一个棘手的问题:它的值
0
,意思是
NULL
==0为真,但它的表示可能不全是零位。我不知道有哪个CPU没有,但标准允许。有人会来这里说
calloc()
memset()
不能保证将指针设置为NULL,这在技术上是正确的,但对他们来说,我先发制人地说,不起作用的系统是如此罕见,以至于我们根本不关心它们。@Dietrich Epp:你完全正确。这些链接进一步解释:。您还正确地认识到,calloc()和memset()在几乎所有可以想象的情况下都是可以的。不使用它们的主要原因是“性能”——无论是否确实需要,分配内存的开销(很小!)。@DietrichEpp:我已经在上面的评论中提到过,但同意这是一个没有实际意义的观点。感谢paulsm4提供的链接。不使用它们的一个更好的理由是,当语言提供完成相同任务的基本内置函数时,在
void*
上使用函数是不雅的。对于非数组,实际上没有理由使用
calloc
。我正在寻找一种方法使整个n1为空。例如:n1={0,NULL};我不想一个变量接一个变量。我想一次将所有n1设置为NULL。这样做的好处是,您在用于初始化值的结构中遗漏的任何字段都将自动设置为该类型的适当零值,因此这是非常可维护的:只需编写一个字段(不能有空文本),其他字段将自行处理。
struct A
{
    int x;
    int y;
};
...
A a = {0};