程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中malloc函數返回值是否需要類型強制轉換問題

C語言中malloc函數返回值是否需要類型強制轉換問題

編輯:關於C語言

 


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分配內存.

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved