struct node* new_node =
(struct node*) malloc(sizeof(struct node));
我不明白*這裏:...(struct node*) malloc(siz...
首先,*屬於節點或malloc?這是什麼意思?指針如何與內存函數malloc有關? 我真的很困惑與*位置指向malloc的指針?
感謝
struct node* new_node =
(struct node*) malloc(sizeof(struct node));
我不明白*這裏:...(struct node*) malloc(siz...
首先,*屬於節點或malloc?這是什麼意思?指針如何與內存函數malloc有關? 我真的很困惑與*位置指向malloc的指針?
感謝
在括號中的類型名稱(例如(struct node *)
在c)中被稱爲「轉換」。它是將表達式的類型改變爲指定類型的一種方式,並且通常與指針一起使用。
但是,這是忽略Do I cast the result of malloc中的建議的代碼。演員陣容是而不是需要在這裏,使得這個(在我看來,也許不是很令人驚訝,如果你已經遵循該鏈接)相當不好的代碼。
寫這個分配的最佳方式是:
struct node * new_node = malloc(sizeof *new_node);
此提到的類型恰好一次,降到能引入錯誤,是既沒有意義的,繁瑣的閱讀中投,並指定如何在避免引入脆性分配很多內存。這是勝利,贏得勝利。
+1乾淨整潔。並非所有的C都是眼睛痠痛! –
在我看來,'node_t * new_node = malloc(sizeof(node_t));'遠不及眼睛疼痛。 – Lundin
的*
是的類型。這裏的類型是struct node*
(指向struct node
的指針)。
它不是「連接」到malloc
函數,它是「連接」的類型。 malloc()
返回一個指針,因此您也將返回值指定爲指針。
struct node <= type
*new_node <= pointer named new_node (of type struct node)
= <= assignment
(struct node *) <= cast to pointer of type struct node
malloc(SIZE) <= returns pointer of type void, thus needs cast
'='不是賦值,它是初始化語法的一部分。並不是說它在C中有很大的實際區別,但這就是C語法所說的。 –
我寧願說這個類型是'struct node *'(一個指向節點的指針)。另外,您對需要轉換的void指針不正確。 – Lundin
@Lundin:在語法上,'struct node'是*類型說明符*,'* new_node'是*聲明符*。當然,結果是,'new_node'類型是'struct node *',但是在一個聲明中'*'不是類型說明符的一部分。因此,例如'struct node * ptr,instance;'。 –
(struct node*)
是轉換,這是一個明確的類型轉換。 *
屬於struct node
,聲明所請求的類型是指向變量struct node
的指針。 malloc()總是返回一個空指針void*
。
malloc的函數定義是void* malloc (size_t size);
(在這種情況下,*
也屬於void
)。
在您的問題中發佈代碼的人將此虛構指針轉化爲struct node*
。他們爲什麼這樣做並不明確,他們對C中指針的投入方式感到困惑,也不知道這種類型轉換的危險,或者代碼是爲C++編寫的。
C語言中的void指針是一種通用指針類型,可以轉換爲任何其他指針類型,而無需強制轉換(1)。但是在C++中,當轉換一個void指針時,你必須總是進行強制轉換,因爲C++比C有更嚴格的類型轉換規則,並強制進行顯式轉換。
在C中投射malloc()的結果是危險的,並且被認爲是一個bug(2),因爲除非通過#include提供了正確的函數原型,否則編譯器的默認行爲會啓動並且它會錯誤地認爲malloc返回INT。根據特定系統的指針和整數寬度,它可能工作得很好,或者可能導致程序崩潰和/或泄漏內存。
然而,在C++中投射malloc()的結果是必要的。
參考文獻:
這只是type casting。
malloc
返回void指針(沒有任何類型的指針)。 (struct node *)
表示您正在爲malloc
返回的void指針指定一個類型。 也見this
它只是一個類型鑄造。實際上malloc函數返回void指針(void *),這意味着它不是特定於任何數據結構或數據類型。它返回一個通用指針。 通過類型轉換,我們使返回值具體,在這種情況下(結構節點*),這是一個結構的節點類型的指針。
簡單地說,我們可以說我們將void指針(void *)轉換爲struct指針(struct node *)。
它是一個(不必要的)演員。 'malloc()'的返回值是一個'void *'。請參閱http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – hmjd
「指針如何與內存功能有任何關係」 - 在本例中,相當一切 –