2012-08-22 120 views
3
struct node* new_node = 
      (struct node*) malloc(sizeof(struct node)); 

我不明白*這裏:...(struct node*) malloc(siz... 首先,*屬於節點或malloc?這是什麼意思?指針如何與內存函數malloc有關? 我真的很困惑與*位置指向malloc的指針?

感謝

+4

它是一個(不必要的)演員。 'malloc()'的返回值是一個'void *'。請參閱http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – hmjd

+2

「指針如何與內存功能有任何關係」 - 在本例中,相當一切 –

回答

6

在括號中的類型名稱(例如(struct node *)在c)中被稱爲「轉換」。它是將表達式的類型改變爲指定類型的一種方式,並且通常與指針一起使用。

但是,這是忽略Do I cast the result of malloc中的建議的代碼。演員陣容是而不是需要在這裏,使得這個(在我看來,也許不是很令人驚訝,如果你已經遵循該鏈接)相當不好的代碼。

寫這個分配的最佳方式是:

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

此提到的類型恰好一次,降到能引入錯誤,是既沒有意義的,繁瑣的閱讀中投,並指定如何在避免引入脆性分配很多內存。這是勝利,贏得勝利。

+0

+1乾淨整潔。並非所有的C都是眼睛痠痛! –

+1

在我看來,'node_t * new_node = malloc(sizeof(node_t));'遠不及眼睛疼痛。 – Lundin

0

*是的類型。這裏的類型是struct node*(指向struct node的指針)。

它不是「連接」到malloc函數,它是「連接」的類型。 malloc()返回一個指針,因此您也將返回值指定爲指針。

2
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 
+0

'='不是賦值,它是初始化語法的一部分。並不是說它在C中有很大的實際區別,但這就是C語法所說的。 –

+0

我寧願說這個類型是'struct node *'(一個指向節點的指針)。另外,您對需要轉換的void指針不正確。 – Lundin

+0

@Lundin:在語法上,'struct node'是*類型說明符*,'* new_node'是*聲明符*。當然,結果是,'new_node'類型是'struct node *',但是在一個聲明中'*'不是類型說明符的一部分。因此,例如'struct node * ptr,instance;'。 –

1

(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()的結果是必要的。


參考文獻:

  1. ISO 9899:2011 6.3.2.3/1。
  2. Specifically, what's dangerous about casting the result of malloc?
+0

「類型轉換」更正確地稱爲「轉換」。而「明確的[類型]演員」是多餘的;所有演員都是明確的,並且隱式轉換不是演員。 –

+0

@KeithThompson好吧,這是相當挑剔的,但我更新了帖子,以便它現在使用C標準中使用的形式術語:_cast_,_implicit conversion_和_explicit conversion_。不過,我不太清楚這對初學者程序員有什麼不同。 – Lundin

+0

我從這裏拿走它:http://www.geeksforgeeks.org/archives/860是C++還是隻是一個不好的書面代碼? – Segev

0

這只是type casting

malloc返回void指針(沒有任何類型的指針)。 (struct node *)表示您正在爲malloc返回的void指針指定一個類型。 也見this

0

它只是一個類型鑄造。實際上malloc函數返回void指針(void *),這意味着它不是特定於任何數據結構或數據類型。它返回一個通用指針。 通過類型轉換,我們使返回值具體,在這種情況下(結構節點*),這是一個結構的節點類型的指針。

簡單地說,我們可以說我們將void指針(void *)轉換爲struct指針(struct node *)。