2015-09-04 148 views
0

我想在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.但是,顯然我是seg錯誤,並且想知道是否因爲我解引用指向空指針的指針?

的add()

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 } 

感謝

+1

我們怎麼可能告訴你是否沒有顯示seg故障發生的代碼?如果你解除引用'&list',你將得到'list'。這很好。你不能做的是取消引用'list'。 – kaylum

+0

那麼,你可能知道,如果解引用指向空指針的指針會導致seg錯誤。 **編輯:感謝編輯艾倫,這是我所問...是否可以解引用指針空指針。** –

+0

我可以發佈代碼,更新等待... –

回答

1

此代碼有3個問題:

node = malloc(sizeof(node)); 
node = new_node; 

首先,你的malloc錯誤的字節數。使用模式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; 
     } 
    } 
} 
0

指針只是一種訪問內存的機制。不同類型的指針具有不同的訪問機制。整數指針讀取4個字節,而字符指針在讀取時只讀取1個字節。

對於存儲的東西,您需要分配內存。一旦分配了內存,就可以使用不同的指針來訪問它。 當你寫:

new_node=(struct node*)malloc(sizeof(struct node)) 

這意味着你分配一些內存,並使用new_node指針訪問它。

當你寫:

node=new_node 

這意味着該節點將指向相同的內存new_node目前referring.You不需要分配內存以節點,因爲你只是訪問使用它的已分配的內存。

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; 
    } 
}