sizeof的用法以及編程中的常見問題_第1頁
sizeof的用法以及編程中的常見問題_第2頁
sizeof的用法以及編程中的常見問題_第3頁
sizeof的用法以及編程中的常見問題_第4頁
sizeof的用法以及編程中的常見問題_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

sizeof的用法(yònɡfǎ)以及編程中的常見問題共十八頁sizeof定義(dìngyì)返回一個(gè)對(duì)象或者類型所占的內(nèi)存(nèicún)字節(jié)數(shù)實(shí)際上,sizeof計(jì)算對(duì)象的大小也是轉(zhuǎn)換成對(duì)對(duì)象類型的計(jì)算,也就是說,同種類型的不同對(duì)象其sizeof值都是一致的。sizeof(2)等價(jià)于sizeof(int);sizeof也可以對(duì)一個(gè)函數(shù)調(diào)用求值,其結(jié)果是函數(shù)返回類型的大小,函數(shù)并不會(huì)被調(diào)用

sizeof(foo())//這里foo的返回值不能為空,否則非法共十八頁指針(zhǐzhēn)變量的sizeof指針記錄了另一個(gè)對(duì)象的地址。既然(jìrán)是來存放地址的,那么它當(dāng)然等于計(jì)算機(jī)內(nèi)部地址總線的寬度。所以在32位計(jì)算機(jī)中,一個(gè)指針變量的返回值必定是4(注意結(jié)果是以字節(jié)為單位)。共十八頁數(shù)組的sizeof數(shù)組的sizeof值等于(děngyú)數(shù)組所占用的內(nèi)存字節(jié)數(shù)數(shù)組元素的個(gè)數(shù)chara1[]="abc";intc1=sizeof(a1)/sizeof(char);//總長度/單個(gè)元素的長度

intc2=sizeof(a1)/sizeof(a1[0]);//總長度/第一個(gè)元素的長度共十八頁一個(gè)(yīɡè)問題:voidfoo3(chara3[3])

{

intc3=sizeof(a3);//c3==

}

voidfoo4(chara4[])

{

intc4=sizeof(a4);//c4==

}

c3,c4值應(yīng)該是多少呢?

共十八頁問題的解答:這里函數(shù)參數(shù)a3已不再(bùzài)是數(shù)組類型,而是蛻變成指針,相當(dāng)于char*a3。數(shù)組是“傳址”的,調(diào)用者只需將實(shí)參的地址傳遞過去,所以a3自然為指針類型(char*),c3的值也就為4。共十八頁結(jié)構(gòu)(jiégòu)體的sizeof字節(jié)對(duì)齊(duìqí):有助于加快計(jì)算機(jī)的取數(shù)速度structS1

{

charc;

inti;

};structS2

{

inti;

charc;

};

sizeof(S1),sizeof(S2)?共十八頁字節(jié)對(duì)齊的細(xì)節(jié)和編譯器實(shí)現(xiàn)相關(guān),但一般而言,滿足三個(gè)準(zhǔn)則:

1)結(jié)構(gòu)體變量的首地址能夠被其最寬基本(jīběn)類型成員的大小所整除;

2)結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internaladding);

3)結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本(jīběn)類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)(trailingpadding)。共十八頁說明:由于結(jié)構(gòu)體的成員可以是復(fù)合類型,比如另外一個(gè)結(jié)構(gòu)體,所以在尋找最寬基本類型成員時(shí),應(yīng)當(dāng)(yīngdāng)包括復(fù)合類型成員的子成員,而不是把復(fù)合成員看成是一個(gè)整體。但在確定復(fù)合類型成員的偏移位置時(shí)則是將復(fù)合類型作為整體看待。structS3

{

charc1;

S1s;

charc2;

};

sizeof(S3)?共十八頁S1的最寬簡單成員的類型為int,S3在考慮最寬簡單類型成員時(shí)是將S1“打散”看的,所以S3的最寬簡單類型為int,這樣(zhèyàng),通過S3定義的變量,其存儲(chǔ)空間首地址需要被4整除,整個(gè)sizeof(S3)的值也應(yīng)該被4整除。

c1的偏移量為0,s的偏移量呢這時(shí)s是一個(gè)整體,它作為結(jié)構(gòu)體變量也滿足前面三個(gè)準(zhǔn)則,所以其大小為8,偏移量為4,c1與s之間便需要3個(gè)填充字節(jié),而c2與s之間就不需要了,所以c2的偏移量為12,算上c2的大小為13,13是不能被4整除的,這樣(zhèyàng)末尾還得補(bǔ)上3個(gè)填充字節(jié)。最后得到sizeof(S3)的值為16。共十八頁計(jì)算結(jié)構(gòu)體大小的公式:結(jié)構(gòu)體的大小等于最后一個(gè)成員的偏移量加上其大小再加上末尾的填充字節(jié)(zìjié)數(shù)目,即:sizeof(struct)=offsetof(lastitem)+sizeof(lastitem)+sizeof(trailingpadding)共十八頁編程中的常見(chánɡjiàn)錯(cuò)誤整數(shù)(zhěngshù)的取值范圍chara[300]={0};U8i=0;…for(;i<300;i++){...}共十八頁無符號(hào)(fúhào)數(shù)intarray[]={23,24,12,17,204,99,16};#defineTATOL_ELEMENTS(sizeof(array)/sizeof(array[0]))main(){intd=-1,x;…if(d<=TATOL_ELEMENTS-2)x=array[d+1];…}共十八頁《c專家編程》建議:盡量不要(bùyào)在你的代碼中使用無符號(hào)類型,以免增加不必要的復(fù)雜性。尤其是,不要(bùyào)僅僅因?yàn)闊o符號(hào)數(shù)不存在負(fù)值(如年齡)而用它來表示數(shù)量。盡量使用像int那樣的有符號(hào)類型,這樣在涉及升級(jí)混合類型的復(fù)雜細(xì)節(jié)時(shí),不必?fù)?dān)心邊界情況(如-1被轉(zhuǎn)化為很大的正數(shù))。只有在使用位段和二進(jìn)制掩碼時(shí),才使用無符號(hào)數(shù)。應(yīng)該在表達(dá)式中使用強(qiáng)制類型轉(zhuǎn)換,是操作數(shù)均為有符號(hào)數(shù)或無符號(hào)數(shù),這樣就不必由編譯器來選擇結(jié)果的類型。共十八頁case語句漏掉breakbreak中斷(zhōngduàn)了什么?network_code(){switch(line){casething1:doit1();break;casething2:if(x==STUFF){do_first_stuff():if(y==other_stuff)break;do_later_stuff();}/*代碼的意圖是跳到這里…*/initialize_modes_pointer();break;default:processing();}/*但事實(shí)上跳到了這里*/user_modes_pointer();/*致使modes_pointer未初始化*/}共十八頁直接(zhíjiē)使用數(shù)字1.c:intg_array[20];2.cmemset(g_array,0,20);后來:intg_array[18];導(dǎo)致內(nèi)存越界共十八頁《c陷阱(xiànjǐng)和缺陷》共十八頁內(nèi)容(nèiróng)總結(jié)sizeof的用法以及編程中的常見問題。所以在32位計(jì)算機(jī)中,一個(gè)指針變量的返回值必定是4(注意結(jié)果是以字節(jié)為單位)。intarray[]={23,24,12,17

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論