幾個點使:
我看不出你如何在代碼中使用realloc()
,但如果你使用它這樣的,這是錯誤的:
variable = realloc(variable, amount);
當它是無法分配更多內存,realloc()
返回NULL
,但保持原始指針不變。在上面的行中,這意味着variable
是NULL
,我們已經失去了它指向的內存的訪問權限,但是該內存沒有被釋放。正確的成語是:
void *tmp = realloc(variable, amount);
if(tmp)
{
// success! variable invalid, tmp has new allocated data
variable = tmp;
}
else
{
// failure! variable valid, but same size as before, handle error
}
你應該使用第二個是因爲,與realloc()
,失敗是壞的,但在許多情況下相當可回收,不像malloc()
哪裏失敗通常意味着其原因「停止一切與死亡「。
這是一個比較有爭議的問題,但是您是否應該像以前一樣使用malloc()
和realloc()
作爲返回值。考慮:
// functionally identical in C
char *a = malloc(10);
char *b = (char *)malloc(10);
在C++中,鑄造必須製成,因爲在C++ void *
不能隱式轉換爲另一種指針類型。 (我認爲這是一種語言錯誤,但它不是我的判斷依據。)如果您的代碼是C++,那麼無論如何您應該使用new
和delete
。如果你的代碼是C但需要用C++編譯器進行編譯(出於某種原因),你別無選擇,只能進行強制轉換。如果您不需要使用C++編譯器編譯C代碼(類似於必須在Python解釋器中運行Ruby代碼),請繼續以下幾點,這就是我認爲您不應該投射的原因。
在C89,如果沒有被聲明使用的功能,它將被隱式地聲明爲返回一個int
。如果我們忘記了#include <stdlib.h>
並且我們調用malloc()
,那麼沒有強制轉換的版本會導致編譯器錯誤(不允許隱式強制轉換int
到char *
),而帶有強制轉換的版本會(錯誤地)告訴編譯器「我知道這聽起來很瘋狂,但無論如何都要投它。「大多數編譯器會給你一個隱含的(或不兼容的)聲明,像malloc()
這樣的內置函數的聲明,但是演員確實很難找到它。
假設你有一些數據:
float *array = (float *)malloc(10 * sizeof(float));
後來,你發現你需要在你的數據更加精確,並有使這個double
陣列。在上面的線,你需要改變不超過3個不同的地方:
double *array = (double *)malloc(10 * sizeof(double));
如果,另一方面,你這樣寫:
float *array = malloc(10 * sizeof *array);
你只需要改變float
到double
在1個地方。此外,始終使用sizeof *obj
代替sizeof(type)
從不使用強制轉換意味着對realloc()
以後的調用可以工作沒有任何變化,而使用強制轉換和顯式定義名稱將需要找到任何你叫realloc
和改變鑄件和sizeof
秒。另外,如果你忘了,而做到這一點:
double *array = (float *)malloc(10 * sizeof(float));
在大多數平臺上,array
現在只有5個元素的數組,假設對準不關閉,編譯器不抱怨你將float *
分配給double *
。有些人認爲編譯器發出的警告是有幫助的,因爲它指出了可能不正確的行。但是,如果我們避免sizeof(type)
並避免投射,我們可以看到行不會是不正確,因此讓編譯器引起他們的注意力正在浪費時間來編程。
什麼警告並GDB給你? – ezod 2010-01-31 20:38:57