[英]Dereferencing a pointer to a null pointer?
我正在嘗試在c中構建健壯的LinkedList,而我要處理的問題之一是初始化。
struct node* list = malloc(sizeof(node))
這是初始化LList的一種明顯方法,但是它將head
元素的value
初始化為0,這並不是我想要的。 新初始化的LList不應包含任何節點。 相反,我想做這樣的事情:
struct node* list = NULL;
創建一個LList,然后添加具有以下內容的元素:
add(&list, 1);
add(&list, 2);
那基本上將取消引用&list
,測試以查看它是否為NULL
,如果是,則X否則為Y。但是,顯然我是段錯誤的,並且想知道是否是因為我正在將指針指向空指針?
加()
8 void add(struct node** headRef, int value) {
9 struct node* node = *headRef;
10 struct node* new_node = malloc(sizeof(*new_node));
11
12 new_node->value = value;
13 new_node->next = NULL;
14
15 if (node == NULL) {
16 node = malloc(sizeof(node));
17 node = new_node;
18 } else {
19
20 while (node->next != NULL) {
21 node = node->next;
22 }
23
24 node->next = new_node;
25 }
26 }
謝謝
這段代碼有3個問題:
node = malloc(sizeof(node));
node = new_node;
首先,您分配了錯誤的字節數。 使用模式node = malloc(sizeof *node);
。
其次,這會泄漏內存:您將node
指向剛分配的內存塊。 然后,將node
指向new_node
所指向的對象。 這不會留下任何指向已分配塊的指針。
第三, node
是函數的局部變量,因此函數外部的代碼看不到此更改。
我認為您的意思是整個功能應該是這樣的:
void add(struct node** headRef, int value)
{
// Make the new node
struct node* new_node = malloc(sizeof *new_node);
new_node->value = value;
new_node->next = NULL;
// If the list is empty then make the new node be the first node
if ( *headRef == NULL )
*headRef = new_node;
// Otherwise put this node on the end of the list
else for ( struct node *ptr = *headRef; ; ptr = ptr->next )
{
if ( ptr->next == NULL )
{
ptr->next = new_node;
break;
}
}
}
指針只是一種訪問內存的機制。 不同類型的指針具有不同的訪問機制。 整數指針讀取4個字節,而字符指針則在引用時僅讀取1個字節。
為了存儲東西,您需要分配內存。 分配內存后,您可以使用不同的指針訪問它。 當你寫:
new_node=(struct node*)malloc(sizeof(struct node))
這意味着您正在分配一些內存,並使用new_node指針對其進行訪問。
當你寫:
node=new_node
這意味着節點將指向new_node當前引用的相同內存。您不需要為節點分配內存,因為您只是使用它訪問已分配的內存。
void add(struct node** headRef, int value) {
struct node* node = *headRef;
struct node* new_node = malloc(sizeof(struct node));//Always mention datatype rather than mentioning a particular value;
new_node->value = value;
new_node->next = NULL;
if (node == NULL) {
//node = malloc(sizeof(node)); //Not required as you are just accessing the pre-allocated memory;
*headRef = new_node; //Change the actual pointer rather than the local one;
} else {
while (node->next != NULL) {
node = node->next;
}
node->next = new_node;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.