本文概括敘述了一篇老文的內(nèi)容,并且總結對malloc返回值的3種轉(zhuǎn)型方式,(相對于原文)更全面的總結其各自的應用范圍。
1. 原文內(nèi)容
2. 對malloc的3種轉(zhuǎn)型方式
3. 各自的應用范圍
以前有篇文章叫《C/C++ 誤區(qū) —— 強制轉(zhuǎn)換 malloc() 的返回值》。
文章大致內(nèi)容是:
1. malloc函數(shù)在<stdlib.h> 或者 <cstdlib>頭文件中,而不是<malloc.h>。
2. 由于C語言最初沒有void類型,所以是使用char*來代表通用指針。
/* the old declaration of malloc */
char* malloc(size_t size);
char* p = malloc(size * sizeof(*p) );
/* 可以, 不需要轉(zhuǎn)型 */
T1* p1 = malloc(size1 * sizeof(*p1) );
/* (T1!=char) 不可以,char*不能隱式轉(zhuǎn)換成T1* */
T2* p2 = (T2*)malloc(size2 * sizeof(*p2) );
/* (T2!=char) 可以,顯示類型轉(zhuǎn)換 */
3.C語言后來引入了void類型,就可以使用void*代表通用指針,同時規(guī)定void*可以隱式轉(zhuǎn)換到任意指針類型。
/* the new declaration of malloc */
void* malloc(size_t size);
char* p = malloc(size * sizeof(*p) );
/* 仍然可以,void*可以隱式轉(zhuǎn)換到任意指針類型 */
T1* p1 = malloc(size1 * sizeof(*p1) );
/* 現(xiàn)在可以,void*可以隱式轉(zhuǎn)換到任意指針類型 */
T2* p2 = (T1*)malloc(size2 * sizeof(*p2) );
/* 仍然可以,但不再必須 */
4. 在引入了void之后的C語言中,再使用強制轉(zhuǎn)換是畫蛇添足,同時影響代碼維護。
并且說這是一個C/C++的
誤區(qū)。
原文概述完畢,開始說本文章的內(nèi)容:
對malloc返回值的轉(zhuǎn)型,大致有以下三種方式:
1. 僅在C中
/* legal only in C */
/* 新頭文件 */
T* p = malloc(size * sizeof(*p) ); /* T!=void */
/* 舊頭文件 */
T* p = (
T*)malloc(size* sizeof(*p) ); /*
T!=
void */
2.僅在C++中
C++天然支持void,但是不允許void*隱式轉(zhuǎn)換到任意類型指針,需要static_cast。
// legal only in C++
// 新頭文件
T* p = static_cast<T*>( malloc(size * sizeof(*p) ));
// 舊頭文件(目前還有這種編譯器嗎?)
T* p = reinterpret_cast<T*>( malloc(size * sizeof(*p) ));
// 當然在C++中應該考慮
T* p = new T[size];
// 或者
std::vector<T> p(size);
// 但這不是文章討論重點
3.在C/C++中
/* legal in both C and C++ */
/* legal in both new and old header */
T* p = (T*)malloc(size * sizeof(*p) );
第1種對新頭文件的轉(zhuǎn)型方式,如同代碼第1行所說,僅在C編譯器中合法。
因為C++不支持void*到其他指針類型的隱式轉(zhuǎn)換。
所以,原文章說這是C/C++的誤區(qū),并不準確。
這僅僅是(引入void類型之后的)C語言中的“非必須”的動作,是否是誤區(qū),還有待考量。
第2種對新舊頭文件的轉(zhuǎn)型方式,代碼第1行也說了,僅在C++編譯器中合法。
因為C編譯器不認識static_cast或者reinterpret_cast。
第3種,是一種中庸的寫法。
如同代碼第1行所說:此代碼無論是在C還是C++編譯器,無論是新頭文件還是舊頭文件,都是合法的代碼。是可移植性最好的代碼。
因為代碼中使用的(C風格的)轉(zhuǎn)型、malloc——C/C++都支持。
所以,這種寫法并不一定是誤區(qū)或者畫蛇添足。
因為代碼的作者也許比原文章的作者對移植性(C和C++的新舊編譯器)考慮更多。
一個排版比較好的原文轉(zhuǎn)載鏈接
http://programmingart.blog.51cto.com/213782/43503
posted on 2009-03-06 10:16
OwnWaterloo 閱讀(4107)
評論(4) 編輯 收藏 引用