青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 16,  comments - 34,  trackbacks - 0

本文概括敘述了一篇老文的內容,并且總結對malloc返回值的3種轉型方式,(相對于原文)更全面的總結其各自的應用范圍。

1. 原文內容
2. 對malloc的3種轉型方式
3. 各自的應用范圍

 


 

以前有篇文章叫《C/C++ 誤區 —— 強制轉換 malloc() 的返回值》。
文章大致內容是:

1. malloc函數在<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) );
/* 可以, 不需要轉型 */

T1
* p1 = malloc(size1 * sizeof(*p1) );
/* (T1!=char不可以,char*不能隱式轉換成T1*  */

T2
* p2 = (T2*)malloc(size2 * sizeof(*p2) );
/* (T2!=char) 可以,顯示類型轉換 */

 

3.C語言后來引入了void類型,就可以使用void*代表通用指針,同時規定void*可以隱式轉換任意指針類型。

/* the new declaration of malloc */
void* malloc(size_t size);

char* p = malloc(size * sizeof(*p) );
/* 仍然可以,void*可以隱式轉換到任意指針類型 */

T1
* p1 = malloc(size1 * sizeof(*p1) );
/* 現在可以,void*可以隱式轉換到任意指針類型 */

T2
* p2 = (T1*)malloc(size2 * sizeof(*p2) );
/* 仍然可以,但不再必須 */


4. 在引入了void之后的C語言中,再使用強制轉換是畫蛇添足,同時影響代碼維護。
并且說這是一個C/C++的誤區

 



原文概述完畢,開始說本文章的內容:
對malloc返回值的轉型,大致有以下三種方式:

 

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*隱式轉換到任意類型指針,需要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種對新頭文件的轉型方式,如同代碼第1行所說,在C編譯器中合法。
因為C++不支持void*到其他指針類型的隱式轉換。
所以,原文章說這是C/C++的誤區,并不準確。
這僅僅是(引入void類型之后的)C語言中的“非必須”的動作,是否是誤區,還有待考量。

第2種對新舊頭文件的轉型方式,代碼第1行也說了,在C++編譯器中合法。

因為C編譯器不認識static_cast或者reinterpret_cast。


第3種,是一種中庸的寫法。
如同代碼第1行所說:此代碼無論是在C還是C++編譯器,無論是新頭文件還是舊頭文件,都是合法的代碼。是可移植性最好的代碼。

因為代碼中使用的(C風格的)轉型、malloc——C/C++都支持。

所以,這種寫法并不一定是誤區或者畫蛇添足
因為代碼的作者也許比原文章的作者對移植性(C和C++的新舊編譯器)考慮更多。


一個排版比較好的原文轉載鏈接
http://programmingart.blog.51cto.com/213782/43503

posted on 2009-03-06 10:16 OwnWaterloo 閱讀(4157) 評論(4)  編輯 收藏 引用

FeedBack:
# re: 對malloc的返回值應該如何轉型
2009-03-17 19:01 | C++ Beginner
學長,問您個很基礎的問題,C風格的強制類型轉換會觸發對應的構造函數么?static_cast和reinterpret_cast會么?另外這兩個轉換符具體做了些什么?  回復  更多評論
  
# re: 對malloc的返回值應該如何轉型
2009-03-17 21:10 | OwnWaterloo
@C++ Beginner
強制轉換都不會觸發構造函數。

 
static_cast用于隱式轉換過程,如:
short s; int i;
= s; //可以,向更寬整數類型進行隱式轉換。
= i; //警告,向更窄整數類型轉換。
= static_cast<short>(i); //過程,明確表明代碼作者的意圖,警告消除。
 
base* b; derived* d;
= d; // 可以,向上轉型,隱式轉換。
= b; // 錯誤,向下轉型,不允許。
= static_cast<derived*>(b); // 可以,向上轉型的過程。但不保證正確
 
object* o; void* p;
= o; // 可以,任何指針類型都可以隱式轉換到void*
= p; // 過程是錯誤,除非
= static_cast<object*>(o); // 可以,但不保證正確
 
 
reinterpret_cast用于整數和指針之間,無繼承關系的指針之間的轉換。
按照其二進制表示,重新解釋(Re-Interpret),如:
T* p; intptr_t i;
= reinterpret_cast<intptr_t>(p);
// 將p的地址,解釋成一個整數。
= reinterpret_cast<T*>(i);
// 將i的值,解釋成一個指向T的指針。
 
T1* p1; T2* p2;
p1 
= reinterpret_cast<T1*>(p2);
// 將p2中保存的地址的值,復制到p1。
// 因為p1是T1*類型的指針,以后對p1的操作,將按T1*來解釋

// 另外一種方式:
p1 = static_cast<T1*>static_cast<void*>(p2) );
  回復  更多評論
  
# re: 對malloc的返回值應該如何轉型
2009-03-17 22:33 | C++ Beginner
學長,我以碰到過到一個ansi字符串轉CString類型的問題,當時發現可以直接這樣來:

char a[100] = "123";
CString str = (CString)a;

我當初認為是這樣強轉觸發了CString的構造函數,構造了一個CString temp變量,然后賦給str。因為我當時查看反匯編時,發現它call了一個很長很奇怪的函數,并且看下來確實是構造函數。

看了學長的解釋,我忽然發現難道自己一直以來對強制類型轉換理解錯了?額……到底是怎么回事?學長賜教!  回復  更多評論
  
# re: 對malloc的返回值應該如何轉型
2009-03-17 22:56 | OwnWaterloo
@C++ Beginner
如果一個用戶自定義類型C,
有一個可以通過單個類型為T的參數進行調用的構造函數,
那么,該構造函數就定義了一個T到C的轉換。

如果該構造函數是explicit的,T到C的轉換是顯式轉換。
如果該構造函數不是explicit,T到C的轉換是隱式轉換。

例如:
class string {
char* content_;
explicit string(const char* source,int length=-1)
:content_(0)
{
if (length==-1)
length = static_cast<int>(strlen(source));
content_ = new char[length+1];
strcpy(source,content_);
}
};

這個構造函數可以通過單個參數調用(第2個參數有默認值),所以這個構造函數定義了一個 const char* 到 string 的轉換。

如果有explicit,那么該轉換必須是顯式轉換:
string s = static_cast<string>("hello");

如果沒有explict,該轉換可以是隱式轉換:
string s = "hello";


上面說錯了,這種轉換確實會調用構造函數。  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(8)

隨筆檔案(16)

鏈接

搜索

  •  

積分與排名

  • 積分 - 199096
  • 排名 - 134

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩午夜av| 午夜激情亚洲| 亚洲风情在线资源站| 久久本道综合色狠狠五月| 在线观看一区二区视频| 欧美激情一区二区三区成人| 欧美精品导航| 久久av一区二区| 欧美不卡视频| 亚洲免费一区二区| 久久激情久久| 99re66热这里只有精品4| 亚洲天堂av图片| 在线播放国产一区中文字幕剧情欧美| 欧美电影资源| 欧美午夜剧场| 老司机精品视频网站| 欧美男人的天堂| 欧美在线观看天堂一区二区三区 | 亚洲综合色自拍一区| 亚洲欧美在线一区二区| 亚洲国产欧美不卡在线观看| 亚洲视频一区在线| 黄色成人av在线| 亚洲精品社区| 激情五月***国产精品| 亚洲人成网站777色婷婷| 国产日产精品一区二区三区四区的观看方式| 卡一卡二国产精品| 国产精品推荐精品| 亚洲激情不卡| 黄网站色欧美视频| 亚洲午夜精品久久久久久浪潮| 国产主播在线一区| 99riav久久精品riav| 伊人色综合久久天天五月婷| 亚洲视频大全| 亚洲免费av观看| 久久在线免费| 久久综合色婷婷| 国产麻豆精品在线观看| 亚洲精选国产| 亚洲精品久久久蜜桃 | 亚洲精品女av网站| 国产精品网站在线播放| 亚洲电影av在线| 亚洲第一精品夜夜躁人人躁| 亚洲欧美激情视频| 午夜精品久久久久久99热软件| 欧美激情偷拍| 欧美国产三级| 一区免费在线| 久久免费99精品久久久久久| 欧美一区二区精美| 国产精品家教| 亚洲私人影吧| 亚洲欧美一区二区视频| 欧美日韩国产一区二区三区地区| 欧美激情第3页| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲永久免费观看| 欧美国产一区二区在线观看| 欧美成人免费小视频| 影音先锋亚洲精品| 久久野战av| 亚洲高清不卡av| 亚洲激情社区| 欧美高清一区| 亚洲精品亚洲人成人网| 在线视频你懂得一区| 欧美日韩一区二区在线播放| 9人人澡人人爽人人精品| 亚洲网站在线| 国产欧美1区2区3区| 午夜精品一区二区三区电影天堂| 久久精品国产亚洲精品| 狠狠网亚洲精品| 另类尿喷潮videofree | 榴莲视频成人在线观看| 在线精品国产成人综合| 欧美高清视频一区二区| 91久久久久久国产精品| 亚洲一区二区三区在线视频| 国产精品日日摸夜夜添夜夜av| 欧美一级大片在线免费观看| 久久综合狠狠综合久久综合88| 亚洲黄色av一区| 欧美午夜在线一二页| 亚洲欧美日韩国产一区| 欧美va亚洲va日韩∨a综合色| 亚洲美女视频在线观看| 国产精品久久久久9999高清| 久久精品亚洲一区二区三区浴池 | 9l国产精品久久久久麻豆| 国产精品萝li| 男男成人高潮片免费网站| 99视频热这里只有精品免费| 久久精品视频在线观看| 亚洲精品一级| 国产网站欧美日韩免费精品在线观看| 久久人人精品| 亚洲午夜精品一区二区| 久久这里只有| 亚洲欧美欧美一区二区三区| 亚洲国产成人av在线| 国产精品欧美日韩| 免费成人av在线| 欧美在线观看www| 亚洲精选一区| 欧美va亚洲va日韩∨a综合色| 亚洲一区二区三区四区五区黄| 黄色一区二区在线| 国产精品日韩高清| 欧美国产日韩一区二区| 久久精品国产99精品国产亚洲性色 | 亚洲一区黄色| 亚洲黄色在线| 免费成人高清视频| 欧美影院久久久| 亚洲在线一区| 在线一区欧美| 亚洲精品在线电影| 亚洲盗摄视频| 一区在线播放| 国内精品久久久久久影视8| 欧美午夜片欧美片在线观看| 免费观看成人| 美女国内精品自产拍在线播放| 久久激情网站| 久久成人羞羞网站| 欧美在线观看天堂一区二区三区| 一区二区日韩伦理片| 日韩视频不卡| 日韩午夜av电影| 亚洲精品影视| 亚洲理论在线| 一本色道久久88综合日韩精品| 亚洲茄子视频| 亚洲欧洲日本mm| 亚洲精品免费在线| 一本一道久久综合狠狠老精东影业| 亚洲欧洲综合另类| 亚洲欧洲日本mm| 亚洲欧洲综合另类在线| 亚洲精品日韩综合观看成人91| 亚洲精品国产精品久久清纯直播| 亚洲电影观看| 日韩午夜av| 亚洲视频在线观看三级| 亚洲欧美日本另类| 欧美一级专区免费大片| 久久精品官网| 欧美福利专区| 国产精品v日韩精品v欧美精品网站| 欧美午夜精品理论片a级按摩| 国产精品亚洲аv天堂网| 国产婷婷色一区二区三区四区| 在线观看91精品国产入口| 亚洲国产清纯| 亚洲欧美日韩视频一区| 久久精品国产77777蜜臀| 玖玖在线精品| 日韩手机在线导航| 亚洲在线成人| 久久久久久久综合色一本| 欧美激情按摩| 国产精品一区久久久| 伊伊综合在线| 亚洲在线一区二区| 美脚丝袜一区二区三区在线观看| 亚洲国产精品久久久久久女王| 日韩视频一区二区三区在线播放免费观看 | 久久精品国产欧美激情| 欧美成人有码| 这里只有精品丝袜| 久久免费国产| 欧美丝袜一区二区| 在线观看日韩国产| 亚洲小说欧美另类社区| 久久亚洲精品一区| 亚洲免费大片| 久久国产一区二区| 欧美视频在线观看视频极品| 精品二区久久| 羞羞漫画18久久大片| 亚洲第一区在线| 欧美一区二区三区在线免费观看| 欧美黄色aa电影| 狠狠色香婷婷久久亚洲精品| 国产精品99久久久久久久久久久久| 久久精品欧洲| 一区二区三区www| 模特精品在线| 国模一区二区三区| 亚洲欧美日韩国产一区二区| 亚洲国产精品www| 久久乐国产精品| 国产欧美91| 亚洲欧美国内爽妇网| 亚洲三级电影在线观看|