簡體   English   中英

將指針解引用為空指針?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM