首先要說的是,使用 malloc 函數,請包含 stdlib.h(C++ 中是 cstdlib) ,而不是 malloc.h .因為 malloc.h 從來沒有在 C 或者 C++ 標准中出現過! 因此並非所有編譯器都有 malloc.h 這個頭文件。但是所有的 C 編譯器都應該 有 stdlib.h 這個頭文件。
在 C++ 中,強制轉換 malloc() 的返回值 是必須的,否則不能通過編譯。但是在 C 中,這種強制轉換卻是多余的,並且 不利於代碼維護。
起初,C 沒有 void 指針,那時 char* 被用來作為泛 型指針(generic pointer),所以那時 malloc 的返回值是 char* .因此,那 時必須強制轉換 malloc 的返回值。後來,ANSI C(即C89) 標准定義了void 指針作為新的泛型指針。void 指針可以不經轉換,直接賦值給任何類型的指針 (函數指針除外)。從此,malloc 的返回值變成了 void* ,再也不需要強制轉 換 malloc 的返回值了。以下程序在 VC6 編譯無誤通過。
#include <stdlib.h>
int main( void )
{
double *p = malloc( sizeof *p ); /* 不推薦用 sizeof( double ) */
free(p);
return 0;
}
當然,強制轉換malloc的返回值並沒有錯,但畫蛇添足!例如,日後你有可 能把double *p改成int *p.這時,你就要把所有相關的 (double *) malloc (sizeof(double))改成(int *)malloc(sizeof(int))。如果改漏了, 那麼你的程序就存在 bug .就算你有把握把所有相關的語句都改掉,但這種無聊 乏味的工作你不會喜歡吧!不使用強制轉換可以避免這樣的問題,而且書寫簡便 ,何樂而不為呢?使用以下代碼,無論以後指針改成什麼類型,都不用作任何修 改。
double *p = malloc( sizeof *p );
類似地,使用 calloc ,realloc 等返回值為 void* 的函數時,也不需要強制轉換返回值。