I am trying to implement a stack using linked list, and firstly I have the following code:
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;
}
For the inti_stack
function, can I just do the following and that would be equivalent?
Node* inti_stack() {
Node* node = malloc(sizeof * node);
if (!node) exit(EXIT_FAILURE);
return node;
}
CodePudding user response:
In the first case:
Node* node = NULL;// allocate a new node in a heap
node = malloc(sizeof * node);
The value of node
is determinate. malloc()
will overwrite it with a pointer to a chunk of heap memory if it succeeded.
In the second case:
Node* node = malloc(sizeof * node);
The value of node
is indeterminate, but it's going to be overwritten by malloc()
nevertheless.
So yes, they're both equivalent. Though the latter is preferred.
NB that malloc()
will return a NULL
pointer on failure, and set errno
on some implementations. Your code should check for it.
Aside: Why exit()
without an error message?
if (!node) exit(EXIT_FAILURE);
/* I'd expect a fprintf()/perror() here */
CodePudding user response:
In the first code snippet
Node* node = NULL;// allocate a new node in a heap
node = malloc(sizeof * node);
the declared pointer node
is at once overwritten.
So it is enough to write
Node* node = malloc(sizeof * node);
If the function malloc
is unable to allocate memory it returns a null pointer.
Pay attention to that the name of the function inti_stack
is unclear.