2017-04-10 120 views
-4

我試圖做列出了簡單的功課,我想編寫一個函數:如果頭是指向爲什麼我不能在if語句中使用空指針?

  1. 接收雙指針鏈表的頭和一個整數
  2. 檢查某事或NULL
  3. 如果頭指向NULL,然後將其重新分配到新的存儲位置包含我的新節點[等]
  4. 如果不爲空,只需添加新節點列表的底部

但是,當我的代碼檢查頭列表是否爲NULL時,我收到「讀訪問內存違規」 這是我的代碼:

void InserList(t_node** lis, int x) { 
    t_node* temp; 
    temp = malloc(sizeof(t_node)); 
    temp->num = x; 
    if (*lis == NULL) { 
     temp->next = NULL; 
     *lis = temp; 
    } 
    else { 
     temp = *lis; 
     while (temp->next != NULL) { 
      temp = temp->next; 
     } 
     temp->next = malloc(sizeof(t_node)); 
     temp->next->num = x; 
     temp->next->next = NULL; 
    } 
} 

我的代碼運行沒有問題,直到它必須這樣做:

if (*lis == NULL) { 
     ... 
} 

給我一個錯誤 「LIS是nullptr」。 我的想法錯了嗎?我應該如何解決這個功能?

謝謝

編輯:這是最主要的功能

int main(void) { 
    int elements; 
    int count; 
    int tempnum; 
    t_node *head, *second_head; 
    head = second_head = NULL; 
    t_node **ref_head, **ref_second_head; 
    ref_head = &head; 
    ref_second_head = &second_head; 
    scanf("%d", &elements); 
    for (count = 0; count != elements; count++) { 
     scanf("%d", &tempnum); 
     InserList(head, tempnum); 
     if (IsPrimo(tempnum) == false) { 
      InserList(second_head, tempnum); 
     } 
    } 
    PrintList(second_head); 
} 
+1

你是怎麼稱呼'InserList'的?這就是'lis'的來源,畢竟 – StoryTeller

+1

'if(lis == NULL)'不需要取消引用(取決於你如何管理它) – BlackBear

+1

'lis'本身就是一個指針,爲什麼不先檢查它呢? –

回答

2

這就是爲什麼你應該有警告編譯。這裏就是你要做的:

InserList(head, tempnum); 

你傳遞一個t_node *其中t_node **預期。這些是不兼容的指針類型。您的程序因此具有未定義的行爲。

修復是:

InserList(&head, tempnum); 

然後給你的編譯器高水平的警告標誌和修復您的代碼,直到它沒有警告的。

+0

謝謝,我也意識到我做了「ref_head 「和」ref_second_head「只是爲了這個,但我沒有使用它們,我是一個白癡。 再次感謝你 – RaiN

相關問題