1. 在C語言中, 如果調用的函數沒有函數原型, 則其返回值將默認為 int 型.
考慮調用malloc函數時忘記了 #include <stdlib.h>的情況
此時malloc函數返回值將為 int 而不是void * (這是C語言的規則, 所有沒有函數原型的函數返回值都為int), 此時如果在程序中有如下語句
[cpp]
int *p = malloc(10);
int *p = malloc(10);
則編譯器會給出警告, ``assignment of pointer from integer lacks a cast'' ( 應該是較早版本的編譯器, 最新的編譯器如gcc中, 如果函數原型沒有顯式的給出, 則會給出警告"warning: implicit declaration of function ‘malloc’", 所以其實只要忘了 #include <stdlib.h> 編譯器就會給警告了), 如果此時是如下語句
[cpp]
int *p = (int *) malloc (10);
int *p = (int *) malloc (10);
則會將 malloc 的返回值 int 強制轉換為指向int類型的指針, 此時編譯器不給出``assignment of pointer from integer lacks a cast'' 的警告(實際上現在的編譯器會因為malloc函數沒有聲明函數原型而給出警告), 但這樣的轉換有可能會帶來問題.
2. 在C++中, 如果不對malloc函數的返回值進行顯示的強制類型轉換, 則編譯會出錯.
下面的語句
[cpp]
int *p = malloc(10);
int *p = malloc(10);在.c文件中以C語言語法編譯不會報錯, 能夠通過, 但如果改為.cpp文件以C++語法編譯則會報錯 " error: invalid conversion from ‘void*’ to ‘int*’ ", 由此可以看出C++的語法檢查更嚴格一點. 不過在C++中更應該用new來分配內存, 而不是malloc.
所以最好的方法應該是在C語言中malloc函數不用強制類型轉換, 但如果程序考慮到C++的兼容性的話, 那應該使用強制類型轉換, 而在C++程序中應該用new來代替malloc分配內存.