在堆上分配节点,第一次赋值给NULL与使用malloc [c]直接赋值之间的差异

9q78igpj  于 2023-01-29  发布在  其他
关注(0)|答案(2)|浏览(130)

我尝试用链表实现一个栈,首先我有以下代码:

typedef struct Node {
    int data;               // integer data
    struct Node* next;      // pointer to the next node
} Node;

Node* inti_stack() {
    Node* node = NULL;// allocate a new node in a heap
    node = malloc(sizeof * node);
    if (!node) exit(EXIT_FAILURE);
    return node;
}

对于inti_stack函数,我可以只执行以下操作吗?

Node* inti_stack() {
    Node* node = malloc(sizeof * node);
    if (!node) exit(EXIT_FAILURE);
    return node;
}
but5z9lq

but5z9lq1#

在第一种情况下:

Node* node = NULL;// allocate a new node in a heap
node = malloc(sizeof * node);

node的值是确定的。如果成功,malloc()将用指向堆内存块的指针覆盖它。
在第二种情况下:

Node* node = malloc(sizeof * node);

node的值是不确定的,但是它将被malloc()覆盖。
所以是的,它们是等价的。尽管后者更可取。
注意malloc()在失败时会返回一个NULL指针,并且在一些实现中设置errno。您的代码应该检查它。
旁白:为什么exit()没有错误消息?

if (!node) exit(EXIT_FAILURE);
/* I'd expect a fprintf()/perror() here */
egdjgwm8

egdjgwm82#

在第一个代码片段中

Node* node = NULL;// allocate a new node in a heap
node = malloc(sizeof * node);

立即重写所声明的指针node
所以写就够了

Node* node = malloc(sizeof * node);

如果函数malloc无法分配内存,则返回空指针。
注意,函数inti_stack的名称不清楚。

相关问题