2016-11-22 106 views
0
struct node *tempNode = (struct node*) malloc(sizeof(struct node)); 

//and 

struct node *tempNode = malloc(sizeof(struct node)); 
+0

'(struct node *)'由於malloc返回一個void指針而導致編譯錯誤消失。 – Ultimater

+1

@Ultimater在C中不會有任何警告。參見http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

+2

C中第一種被認爲是不好的實踐;自C90標準以來,您並不需要明確地指定'malloc'的返回值,並且在此標準下可以抑制有用的診斷。而寫一個更好的方法是'struct node * tempNode = malloc(sizeof * tempNode);'。 –

回答

0
struct node *tempNode = (struct node*) malloc(sizeof(struct node)); 

你動態分配空間給一個節點指針tempNode和類型轉換它是一個結構節點*類型。 (指針結構)

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

與上面相同,除了沒有明確的類型轉換(結構節點*)

0

沒有區別。由於malloc返回類型void *,因此可以將其分配給任何指針類型的變量而無需強制轉換。正如John Bode所提到的,投射malloc的結果被認爲是不好的做法,因爲它可能會掩蓋由於具有malloc的其他定義而導致的編譯器錯誤。

0

既然你正確地鑄造它,兩者之間沒有區別。

但是因爲可以將void*隱式轉換爲任何其他(數據)指針類型,所以在C中一般不贊成。

也看到這款C FAQ條目:What's wrong with casting malloc's return value?

一個第三人在那裏:

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

,這是更好,因爲它使在案件類型改變較少的變化。

+0

是不是第一句矛盾說在鏈接? –

+0

@EugeneSh。對於所有其他相關問題,我都包含鏈接*。如果你正在談論「忘記包含..」,它不是一個有效的C程序(隱式int不再被允許)。任何體面的編譯器都會爲此發出警告。我沒有看到來自OP的完整代碼。所以,我假設OP包括它。對於我所知道的,如果你想達到挑剔的級別,可能會有'#define malloc NULL'。 – usr

+1

假設第一個評論者是downvoter是* Post hoc ergo propter hoc *。這不是一個挑剔的問題。投射「malloc」的結果是衆所周知的「不 - no」。 –

-1

通過調用malloc,分配的內存大小爲struct node(以字節爲單位)。它將void*返回給分配的內存。

現在的事情是:你的兩行完全一樣,但第二行在編譯C++編譯器時會導致警告。

C允許將void*隱式轉換爲不同的指針類型,而C++編譯器會 - 至少 - 警告你,或給你一個錯誤。

+0

這不是一個C++問題,或者java,C#,B * f等。 –

+0

@WeatherVane所以你有什麼意思?在C中,顯然沒有區別,但是提問者很可能想知道這一點,C++與C相比其他任何東西都更相關。 – maxdev

+0

我很抱歉,但C++不在桌面上,不管你認爲它有多「相關」。在C中,如果你認爲「顯然沒有區別」,那麼你還沒有閱讀[鏈接已發佈](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) 。我被誘惑到DV,但給了你回收答案的機會。 –