程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C/C++誤區三:強制轉換 malloc() 的返回值

C/C++誤區三:強制轉換 malloc() 的返回值

編輯:關於C++

首先要說的是,使用 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* 的函數時,也不需要強制轉換返回值。

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