2016-08-10 141 views
1

下面是一個簡單的代碼,我試圖使用指針指向指向鏈表添加節點。指向指針的指針:引用成員中的錯誤

#include <stdio.h> 
#include <malloc.h> 

struct node 
{ 
     int data; 
     struct node *next; 
}; 

void insert(struct node **root) 
{ 
    struct node * temp = (struct node *)malloc(sizeof(struct node)); 
    if(*root == NULL) 
    { 
     *(root) = (struct node *) malloc (sizeof(struct node)); 
     *(root)->data = 5; 
     *(root)->next = temp; 
    } 
    else 
     printf("here"); 
} 

int main() 
{ 
    struct node *root = NULL; 
    insert(&root); 
    return 0; 
} 

我的理解是,在main()塊中分配到root。並在insert該內存塊的地址傳遞參數。然後它檢查它們是否分配給該地址處的結構的內存塊,如果它是NULL,則將內存分配給結構塊。這應該由*root。可是當我執行上面的代碼中,我碰到下面的錯誤引用:

error: request for member 'data' in something not a structure or union 

我不能夠理解我要去的地方錯了究竟。

+3

'*(根) - >數據= 5;' - >>'(*根) - >數據= 5;'BTW:你的代碼在某些代碼路徑上泄漏'* temp'內存。並且:除去演員,他們只能做傷害。 – wildplasser

+0

它工作!謝謝@wildplasser。您能否簡單介紹兩種情況下的優先順序。 –

+0

其他人已經做到了。 ' - >'和'。'具有最高的優先級(「綁定更緊密」); '*'是*較弱*。 '#include 'malloc.h是一個非標準的頭文件。你想'stdlib.h' – wildplasser

回答

3

->綁定比解引用操作符(*)更緊密。請參閱operator precedence。所以,

*(root)->data = 5; 

等同於:

*(root->data) = 5; 

你打算怎麼辦是:

(*root)->data = 5; 

同爲下一行,這應該是:

(*root)->next = temp; 

另請注意,malloc.h不是por表。您應該包含C標準標頭stdlib.h>,而不是爲malloc()獲取原型。

1

->運算符的優先級高於解引用運算符*。完整列表請參考here。 所以像

*(root)->data = 5; 

該線將是非法的,因爲第一它試圖找到一些由root指出現場data,顯然沒有找到它,因爲它是一個指針類型,以及。

相反,你應該使用顯式的優先級:

(*root)->data = 5;