2009-06-04 58 views
51

我想請教一下下面的情況:我應該明確地施放malloc()的返回值嗎?

char *temp; 
temp = malloc(10); 

由於malloc返回類型是void*,將由malloc返回的指針隱式轉換爲char*類型被分配到臨時過嗎?標準在這方面說了什麼?

如果我們的指針變量例如一些結構類型:

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

如果我們沒有它鑄造於struct node*型分配內存來臨時,將其隱式轉換爲struct node*型或者是有必要明確地投它到struct node*類型?

+7

如果您可能需要使用C++編譯器而不是C編譯器編譯代碼,那麼需要強制轉換。因此,我的大部分代碼都包含了明確的轉換 - 儘管純C並不需要它。我通常用/ * = C++ = * /來標記它以指示原因。 – 2009-06-04 23:32:53

+0

儘管沒有必要,但對於我來說,稍後可以幫助我閱讀代碼,而且不需要冗長。 – Xolve 2010-08-07 06:26:42

+2

請參閱[此問題](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)。 – unwind 2013-06-04 14:50:57

回答

33

C語言中的void指針可以分配給任何指針而不需要顯式強制轉換。

+9

我不認爲它適用於函數指針。 – 2009-06-04 21:51:06

10

C隱式地從和到void*,所以演員將自動完成。在C++中,只有轉換void*會隱式完成,因爲其他方向需要顯式強制轉換。

+2

注意:C++不支持轉換爲void *而無需強制轉換。 – 2009-06-04 21:15:10

3

在C++中,你必須明確地強制轉換,但這實際上只是告訴你這樣做的語言。
在c中沒有任何需要強制轉換,內存只是內存 - 我將不得不搜索一下,看看最新的C標準是否需要它。

49

如果您喜歡「不要重複自己」的心態,那麼在malloc()調用中,您不需要重複變量聲明中的類型名稱。因爲,正如人們已經指出的那樣,你不需要:除了函數指針之外,指針可以毫無損失地轉換成void *

此外,在該筆記中,您也不需要重複使用sizeof。你的第二個例子,分配結構時,可以這樣寫:

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

這在我不那麼愚見是最好方式。

避免重複自己,減少了你寫的東西的數量,從而減少了這些事情出錯的風險。

請注意sizeof參數中的星號,意思是「該指針指向的對象的大小」,當然這與「類型struct node的大小」相同,但不重複類型名稱。這是因爲sizeof計算(在編譯時!)作爲其參數的表達式的大小。對於這種情況。就像sizeof 3計算int類型的表達式的大小,sizeof *temp計算struct node的實例的大小。

當然,你做重複東西,即變量名本身,而這往往是一個簡單的表達,更容易得到正確的,也可以是編譯器更容易在發現錯誤。

相關問題