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

posts - 16,  comments - 34,  trackbacks - 0

本文概括敘述了一篇老文的內(nèi)容,并且總結(jié)對(duì)malloc返回值的3種轉(zhuǎn)型方式,(相對(duì)于原文)更全面的總結(jié)其各自的應(yīng)用范圍。

1. 原文內(nèi)容
2. 對(duì)malloc的3種轉(zhuǎn)型方式
3. 各自的應(yīng)用范圍

 


 

以前有篇文章叫《C/C++ 誤區(qū) —— 強(qiáng)制轉(zhuǎn)換 malloc() 的返回值》。
文章大致內(nèi)容是:

1. malloc函數(shù)在<stdlib.h> 或者 <cstdlib>頭文件中,而不是<malloc.h>。


2. 由于C語(yǔ)言最初沒(méi)有void類(lèi)型,所以是使用char*來(lái)代表通用指針。

/* 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) 可以,顯示類(lèi)型轉(zhuǎn)換 */

 

3.C語(yǔ)言后來(lái)引入了void類(lèi)型,就可以使用void*代表通用指針,同時(shí)規(guī)定void*可以隱式轉(zhuǎn)換任意指針類(lèi)型。

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

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

T1
* p1 = malloc(size1 * sizeof(*p1) );
/* 現(xiàn)在可以,void*可以隱式轉(zhuǎn)換到任意指針類(lèi)型 */

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


4. 在引入了void之后的C語(yǔ)言中,再使用強(qiáng)制轉(zhuǎn)換是畫(huà)蛇添足,同時(shí)影響代碼維護(hù)。
并且說(shuō)這是一個(gè)C/C++的誤區(qū)

 



原文概述完畢,開(kāi)始說(shuō)本文章的內(nèi)容:
對(duì)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)換到任意類(lèi)型指針,需要static_cast。

// legal only in C++

// 新頭文件
T* p = static_cast<T*>( malloc(size * sizeof(*p) ));

// 舊頭文件(目前還有這種編譯器嗎?)
T* p = reinterpret_cast<T*>( malloc(size * sizeof(*p) ));

// 當(dāng)然在C++中應(yīng)該考慮
T* p = new T[size];
// 或者
std::vector<T> p(size);
// 但這不是文章討論重點(diǎn)


3.在C/C++中

/* legal in both C and C++ */
/* legal in both new  and old header */
T
* p = (T*)malloc(size * sizeof(*p) );

 



第1種對(duì)新頭文件的轉(zhuǎn)型方式,如同代碼第1行所說(shuō),在C編譯器中合法。
因?yàn)镃++不支持void*到其他指針類(lèi)型的隱式轉(zhuǎn)換。
所以,原文章說(shuō)這是C/C++的誤區(qū),并不準(zhǔn)確。
這僅僅是(引入void類(lèi)型之后的)C語(yǔ)言中的“非必須”的動(dòng)作,是否是誤區(qū),還有待考量。

第2種對(duì)新舊頭文件的轉(zhuǎn)型方式,代碼第1行也說(shuō)了,在C++編譯器中合法。

因?yàn)镃編譯器不認(rèn)識(shí)static_cast或者reinterpret_cast。


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

因?yàn)榇a中使用的(C風(fēng)格的)轉(zhuǎn)型、malloc——C/C++都支持。

所以,這種寫(xiě)法并不一定是誤區(qū)或者畫(huà)蛇添足
因?yàn)榇a的作者也許比原文章的作者對(duì)移植性(C和C++的新舊編譯器)考慮更多。


一個(gè)排版比較好的原文轉(zhuǎn)載鏈接
http://programmingart.blog.51cto.com/213782/43503

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

FeedBack:
# re: 對(duì)malloc的返回值應(yīng)該如何轉(zhuǎn)型
2009-03-17 19:01 | C++ Beginner
學(xué)長(zhǎng),問(wèn)您個(gè)很基礎(chǔ)的問(wèn)題,C風(fēng)格的強(qiáng)制類(lèi)型轉(zhuǎn)換會(huì)觸發(fā)對(duì)應(yīng)的構(gòu)造函數(shù)么?static_cast和reinterpret_cast會(huì)么?另外這兩個(gè)轉(zhuǎn)換符具體做了些什么?  回復(fù)  更多評(píng)論
  
# re: 對(duì)malloc的返回值應(yīng)該如何轉(zhuǎn)型
2009-03-17 21:10 | OwnWaterloo
@C++ Beginner
強(qiáng)制轉(zhuǎn)換都不會(huì)觸發(fā)構(gòu)造函數(shù)。

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

// 另外一種方式:
p1 = static_cast<T1*>static_cast<void*>(p2) );
  回復(fù)  更多評(píng)論
  
# re: 對(duì)malloc的返回值應(yīng)該如何轉(zhuǎn)型
2009-03-17 22:33 | C++ Beginner
學(xué)長(zhǎng),我以碰到過(guò)到一個(gè)ansi字符串轉(zhuǎn)CString類(lèi)型的問(wèn)題,當(dāng)時(shí)發(fā)現(xiàn)可以直接這樣來(lái):

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

我當(dāng)初認(rèn)為是這樣強(qiáng)轉(zhuǎn)觸發(fā)了CString的構(gòu)造函數(shù),構(gòu)造了一個(gè)CString temp變量,然后賦給str。因?yàn)槲耶?dāng)時(shí)查看反匯編時(shí),發(fā)現(xiàn)它c(diǎn)all了一個(gè)很長(zhǎng)很奇怪的函數(shù),并且看下來(lái)確實(shí)是構(gòu)造函數(shù)。

看了學(xué)長(zhǎng)的解釋?zhuān)液鋈话l(fā)現(xiàn)難道自己一直以來(lái)對(duì)強(qiáng)制類(lèi)型轉(zhuǎn)換理解錯(cuò)了?額……到底是怎么回事?學(xué)長(zhǎng)賜教!  回復(fù)  更多評(píng)論
  
# re: 對(duì)malloc的返回值應(yīng)該如何轉(zhuǎn)型
2009-03-17 22:56 | OwnWaterloo
@C++ Beginner
如果一個(gè)用戶自定義類(lèi)型C,
有一個(gè)可以通過(guò)單個(gè)類(lèi)型為T(mén)的參數(shù)進(jìn)行調(diào)用的構(gòu)造函數(shù),
那么,該構(gòu)造函數(shù)就定義了一個(gè)T到C的轉(zhuǎn)換。

如果該構(gòu)造函數(shù)是explicit的,T到C的轉(zhuǎn)換是顯式轉(zhuǎn)換。
如果該構(gòu)造函數(shù)不是explicit,T到C的轉(zhuǎn)換是隱式轉(zhuǎn)換。

例如:
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_);
}
};

這個(gè)構(gòu)造函數(shù)可以通過(guò)單個(gè)參數(shù)調(diào)用(第2個(gè)參數(shù)有默認(rèn)值),所以這個(gè)構(gòu)造函數(shù)定義了一個(gè) const char* 到 string 的轉(zhuǎn)換。

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

如果沒(méi)有explict,該轉(zhuǎn)換可以是隱式轉(zhuǎn)換:
string s = "hello";


上面說(shuō)錯(cuò)了,這種轉(zhuǎn)換確實(shí)會(huì)調(diào)用構(gòu)造函數(shù)。  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(8)

隨筆檔案(16)

鏈接

搜索

  •  

積分與排名

  • 積分 - 198796
  • 排名 - 134

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美高清在线视频| 99re国产精品| 亚洲精品欧美日韩| 亚洲第一网站免费视频| 国产精品一香蕉国产线看观看| 久久精品一区蜜桃臀影院 | 亚洲一区二区伦理| 亚洲精品免费一区二区三区| 亚洲精品久久久久久久久久久久| 亚洲黄色影片| 99精品免费网| 午夜精品久久久久久久久久久久久| 亚洲综合精品一区二区| 欧美一区二区三区免费大片| 久久精品视频网| 久久人人爽爽爽人久久久| 蜜桃久久av| 亚洲精品中文字幕女同| 亚洲电影免费在线观看| 91久久精品一区二区三区| 亚洲精品一区在线观看香蕉| 中文在线不卡| 久久视频在线看| 亚洲黑丝在线| 亚洲国产天堂久久国产91| 中日韩美女免费视频网站在线观看| 亚洲图片欧洲图片av| 亚洲欧美日韩精品久久亚洲区| 久久久精品2019中文字幕神马| 欧美bbbxxxxx| 亚洲一区二区三区精品在线观看 | 亚洲精品一区二区三区不| 一区二区三区四区蜜桃| 欧美专区18| 亚洲精品在线看| 久久蜜桃资源一区二区老牛| 欧美日韩国产另类不卡| 激情亚洲网站| 欧美亚洲自偷自偷| 亚洲美女尤物影院| 欧美风情在线观看| 国产在线欧美| 亚洲欧美激情一区二区| 亚洲国产欧洲综合997久久| 久久av免费一区| 国产精品一级在线| 亚洲视频axxx| 日韩网站在线观看| 欧美福利电影网| 1024亚洲| 麻豆av一区二区三区久久| 亚洲免费一在线| 欧美丝袜一区二区| 亚洲美女一区| 亚洲国语精品自产拍在线观看| 久久久精品网| 狠狠干成人综合网| 欧美专区在线| 亚洲在线一区二区三区| 欧美午夜精彩| 亚洲视频欧美在线| 最近看过的日韩成人| 蜜臀av在线播放一区二区三区| 国产亚洲精品久久久久动| 亚洲一区久久久| 一本久久综合亚洲鲁鲁五月天| 欧美韩日亚洲| 亚洲裸体俱乐部裸体舞表演av| 免费不卡中文字幕视频| 久久精品国产69国产精品亚洲| 国产日韩欧美一区二区三区四区| 亚洲欧美日韩综合国产aⅴ| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品久久一区二区三区| 99精品国产在热久久婷婷| 亚洲国产精品一区制服丝袜| 免费在线亚洲| 一本一道久久综合狠狠老精东影业 | 亚洲中字黄色| 国产精品女主播在线观看| 亚洲欧美国产毛片在线| 亚洲欧美日韩一区二区在线 | 久久av一区二区三区| 黄色成人在线观看| 欧美国产日本高清在线| 欧美理论电影在线播放| 亚洲一区二区精品在线| 校园激情久久| 亚洲国产精品热久久| 亚洲日韩中文字幕在线播放| 欧美日本精品| 欧美小视频在线| 久久国产综合精品| 免费成年人欧美视频| 在线一区观看| 亚欧成人精品| 亚洲看片免费| 午夜日韩福利| 亚洲精品在线免费| 亚洲欧美精品一区| 亚洲黄色有码视频| 亚洲欧美日韩在线不卡| 亚洲第一天堂av| 亚洲午夜电影网| 亚洲高清色综合| 亚洲一级在线观看| 亚洲精品免费在线播放| 午夜日韩激情| 亚洲综合好骚| 欧美日韩精品一二三区| 蜜桃久久av一区| 国产乱码精品| 日韩亚洲精品电影| 亚洲啪啪91| 久久激情综合网| 亚洲欧美综合一区| 欧美日韩国产综合久久| 久久综合九色| 国产精品国产三级国产aⅴ无密码| 久久在线精品| 国产欧美日韩视频一区二区| 亚洲激情专区| 亚洲国产cao| 久久久国际精品| 欧美一区二区在线免费播放| 欧美日本国产| 亚洲精品国产精品乱码不99| 永久免费视频成人| 性视频1819p久久| 在线观看的日韩av| 亚洲一区二区精品视频| 老司机免费视频一区二区三区| 午夜精品视频在线观看| 欧美aⅴ一区二区三区视频| 久久精品国产免费| 国产精品久久久久久久久久久久久久| 国产精品成人一区二区三区夜夜夜 | 欧美在线视频播放| 午夜精品免费| 国产精品国产三级欧美二区| 亚洲精选视频免费看| 日韩天堂av| 欧美激情按摩| 亚洲三级电影全部在线观看高清| 最新国产成人在线观看| 麻豆亚洲精品| 欧美激情精品| 亚洲免费播放| 欧美日韩一区二区三| 亚洲国产成人porn| 久久久综合精品| 欧美高清在线视频观看不卡| 亚洲电影av在线| 可以免费看不卡的av网站| 久久色中文字幕| 巨乳诱惑日韩免费av| 影音先锋亚洲电影| 欧美va亚洲va国产综合| 亚洲日本成人女熟在线观看| 日韩亚洲国产欧美| av不卡在线看| 欧美另类99xxxxx| 日韩视频精品在线| 亚洲欧美一区二区三区在线| 国产精品区一区二区三| 午夜视频一区| 欧美激情第9页| 亚洲视频www| 国产午夜精品福利| 快播亚洲色图| 99热免费精品| 久久精品国产2020观看福利| 91久久久久久久久久久久久| 欧美视频第二页| 久久久久久久久一区二区| 91久久精品一区| 欧美一级二区| 亚洲日韩欧美视频一区| 国产精品亚洲综合天堂夜夜| 久久一二三四| 亚洲网站啪啪| 欧美国产日本韩| 久久精品国产免费看久久精品| 亚洲人成在线观看| 国产日韩专区在线| 欧美交受高潮1| 久久久久久久91| 在线亚洲激情| 欧美好吊妞视频| 欧美一区激情视频在线观看| 最新成人av在线| 国产喷白浆一区二区三区| 欧美1级日本1级| 久久se精品一区精品二区| 久久久久久久久久码影片| 亚洲激情校园春色| 亚洲婷婷免费| 亚洲激情成人| 久久阴道视频| 久久国产精品一区二区三区|