#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node* head = NULL;
struct node* second = NULL;
struct node* third = NULL;
head = (struct node*)malloc(sizeof(struct node));
second = (struct node*)malloc(sizeof(struct node));
third = (struct node*)malloc(sizeof(struct node));
head->data = 1; //assign data in first node
head->next = second; // Link first node with the second node
second->data = 2; //assign data to second node
second->next = third;
third->data = 3; //assign data to third node
third->next = NULL;
return 0;
}
我是指针的新手,我发现这个代码用于在书中创建链接列表。我不明白为什么主函数中的前三行代码是必要的。为什么我们要求指向节点的指针是空指针? 任何帮助都会受到赞赏,因为这个概念对我来说似乎很难。
答案 0 :(得分:4)
根本没有理由对它们进行初始化。我认为这是一种反模式。在过时的ANSI C(1999年C99问世时已弃用)中,最好不要初始化它们:
struct node* head;
struct node* second;
struct node* third;
head = malloc(sizeof(struct node));
second = malloc(sizeof(struct node));
third = malloc(sizeof(struct node));
如果您忘记malloc
second
的{{1}}内存,编译器可以生成诊断信息:
struct node* head;
struct node* second;
/* ... */
head = malloc(sizeof(struct node));
/* ... */
do_something(head, second);
将使用-Wall
编译的导致gcc
抱怨:
% gcc -Wall test.c
test.c: In function ‘main’:
test.c:11:5: warning: ‘second’ is used uninitialized in this function [-Wuninitialized]
do_something(head, second);
^
但是,您是否已将second
初始化为NULL
:
struct node* head = NULL;
struct node* second = NULL;
// ...
head = malloc(sizeof(struct node));
// ...
do_something(head, second);
GCC会让您的错误无声地传递:
% gcc -Wall test.c
%
在现代C(也是过时的C99,或当前的C11; ANSI C又称C89已被弃用近20年)中,甚至不需要将它们与{{1行你可以写
malloc
这样做要好得多,因为变量会立即用适当的值初始化。
至于使用struct node* head = malloc(sizeof(struct node));
struct node* second = malloc(sizeof(struct node));
struct node* third = malloc(sizeof(struct node));
初始化而不是未初始化的值 - 好吧,只有在使用指针值而不取消引用它时才重要。但取消引用NULL指针或取消引用具有未初始化值的指针都将导致未定义的行为。他们都不需要崩溃。
答案 1 :(得分:1)
你问为什么前三行是必要的,答案就是:“它们不是”。没有必要将它们全部设置为NULL,但是 do 需要声明它们。真的,你可以将第一部分浓缩为:
Var
将它们设置为NULL的主要原因(正如您的代码当前所做的那样)是为了保证不会调用“未定义的行为”。