http://book./201402/40243.html size_t 類型表示C 中任何對(duì)象所能達(dá)到的最大長(zhǎng)度,。它是無(wú)符號(hào)整數(shù),因?yàn)樨?fù)數(shù)在這里沒有意義,。它的目的是提供一種可移植的方法來(lái)聲明與系統(tǒng)中可尋址的內(nèi)存區(qū)域一致的長(zhǎng)度,。size_t 用做sizeof 操作符的返回值類型,同時(shí)也是很多函數(shù)的參數(shù)類型,,包括malloc 和strlen,。 在聲明諸如字符數(shù)或者數(shù)組索引這樣的長(zhǎng)度變量時(shí)用size_t 是好的做法。它經(jīng)常用于循環(huán)計(jì)數(shù)器,、數(shù)組索引,,有時(shí)候還用在指針?biāo)阈g(shù)運(yùn)算上,。 size_t 的聲明是實(shí)現(xiàn)相關(guān)的,。它出現(xiàn)在一個(gè)或多個(gè)標(biāo)準(zhǔn)頭文件中,比如stdio.h 和stblib.h,,典型的定義如下: #ifndef __SIZE_T #define __SIZE_T typedef unsigned int size_t; #endif define 指令確保它只被定義一次,。實(shí)際的長(zhǎng)度取決于實(shí)現(xiàn),。通常在32 位系統(tǒng)上它的長(zhǎng)度是32 位,而在64 位系統(tǒng)上則是64 位,。一般來(lái)說,,size_t 可能的最大值是SIZE_MAX,。 通常size_t 可以用來(lái)存放指針,,但是假定size_t 和指針一樣長(zhǎng)不是個(gè)好主意。稍后的“使用sizeof 操作符和指針”會(huì)講到,,intptr_t 是更好的選擇,。 打印size_t 類型的值時(shí)要小心。這是無(wú)符號(hào)值,,如果選錯(cuò)格式說明符,,可能會(huì)得到不可靠的結(jié)果。推薦的格式說明符是%zu。不過,,某些情況下不能用這個(gè)說明符,, 作為替代,可以考慮%u 或%lu,。 下面這個(gè)例子將一個(gè)變量定義為size_t,,然后用兩種不同的格式說明符來(lái)打印: size_t sizet = -5; printf("%d\n",sizet); printf("%zu\n",sizet); 因?yàn)閟ize_t 本來(lái)是用于表示正整數(shù)的,,如果用來(lái)表示負(fù)數(shù)就會(huì)出問題,。如果為其賦一個(gè)負(fù)數(shù),然后用%d 和%zu 格式說明符打印,,就得到如下結(jié)果: -5 4294967291 %d 把size_t 當(dāng)做有符號(hào)整數(shù),,它打印出-5 因?yàn)樽兞恐写娣诺木褪?5。%zu 把size_t 當(dāng)做無(wú)符號(hào)整數(shù),。當(dāng)-5 被解析為有符號(hào)數(shù)時(shí),,高位置為1,表示這個(gè)數(shù)是負(fù)數(shù),。當(dāng)它被解析為無(wú)符號(hào)數(shù)時(shí),,高位的1 被當(dāng)做2 的乘冪。所以在用%zu 格式說明符時(shí)才會(huì)看到那個(gè)大整數(shù),。 正數(shù)會(huì)正常顯示,,如下所示: sizet = 5; printf("%d\n",sizet); // 顯示5 printf("%zu\n",sizet); // 顯示5 因?yàn)閟ize_t 是無(wú)符號(hào)的,一定要給這種類型的變量賦正數(shù) |
|