基礎C語言知識串串香3?size_t類型


文章參考微信公眾號[嵌入式軟件學習圈]

size_ t類型

C語言標準規(guī)定size_t是一種無符號整數(shù)類型订咸,編譯器可以根據(jù)操作系統(tǒng)的不同而用typedef來定義不同的size_t類型棺禾,即在不同的操作系統(tǒng)上所定義的size_t 可能不一樣锐借。

例如在32位操作系統(tǒng)上可以將size_t定義為unsigned int類型障本,而在64位操作系統(tǒng)上則可以定義為unsigned long int類型棋电,甚至還可以將size_ t定義為unsigned long long int類型栗涂。

size_t類型的引入增強了程序在不同平臺上的可移植性,而它也正是為了方便系統(tǒng)之間的移植而定義的丹拯。

size_t類型的變量大小足以保證存儲內存中對象的大小站超,任何表示對象長度的變量,包括作為大小乖酬、索引死相、循環(huán)計數(shù)和長度的整數(shù)值,都可以聲明為size_t類型剑刑。比如我們常用的sizeof操作符的結果返回的就是size_t類型媳纬,該類型保證能容納實現(xiàn)所建立的最大對象的字節(jié)大小。size_ t 類型的限制是由SIZE_ MAX宏指定的施掏。

接下來看看size_ t類型的使用示例:

char *copy (size_t n钮惠,const char *str )
{
    int i;
    char *p;
    if ( n == 0 ){   
        /*處理n==0的情況*/
    }
    p = (char * )malloc(n) ;
    if (p == NULL){
        /*處理p==NULL的情況*/
    {
    for( i=0; i<n; ++i){
        p[i] = *str++ ;
    }
    return p;
}

不難發(fā)現(xiàn),代碼中存在著一個嚴重的問題:當p所引用的動態(tài)分配的緩沖區(qū)在n> INT_MAX時將會發(fā)生溢出七芭。我們知道素挽,int 類型的限制是由INT_MAX宏指定的,而size_t 類型代表的是一個無符號整數(shù)類型狸驳,它可能包含一個大于INT_MAX的值预明。因此缩赛,當n的值為0<n<= INT_MAX時,執(zhí)行循環(huán)n次撰糠,代碼如預期一樣正常運行酥馍;但當n的值為INT_MAX<n<= SIZE_MAX,且整型變量i的增值超過INT_MAX時阅酪,i 的值將是從INT_MIN開始的負值旨袒。這時,p[i] 所引用的內存位置是在p所引用的內存之前术辐,這就會導致寫入發(fā)生在數(shù)組邊界之外砚尽。

因此,為了避免發(fā)生這種潛在性的錯誤辉词,應該將變量i也聲明成size_t類型必孤,同時利用宏定義SIZE_MAX來檢查輸入的有效性,修改后的程序如下所示:

char *copy (size_t n, const char *str )
{
    size_t i;
    char * p;
    if(n == 0 || n > SIZE_MAX){   
        /*處理輸入無效的情況*/
    }
    p = (char*)malloc(n);
    if( p == NULL ){
        /*處理p==NULL的情況*/
    {
    for ( i=0; i<n; ++i ){
        p[i] = *str++;
    }
    return p;
}

往期熱文:
基礎C語言知識串串香(1)

基礎C語言知識串串香(2)


===========我是華麗的分割線===========


更多知識:
點擊關注專題:嵌入式Linux&ARM

或瀏覽器打開:http://www.reibang.com/c/42d33cadb1c1

或掃描二維碼:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瑞躺,一起剝皮案震驚了整個濱河市敷搪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幢哨,老刑警劉巖购啄,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘱么,居然都是意外死亡,警方通過查閱死者的電腦和手機顽悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門曼振,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔚龙,你說我怎么就攤上這事冰评。” “怎么了木羹?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵甲雅,是天一觀的道長。 經(jīng)常有香客問我坑填,道長抛人,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任脐瑰,我火速辦了婚禮妖枚,結果婚禮上,老公的妹妹穿的比我還像新娘苍在。我一直安慰自己绝页,他們只是感情好荠商,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著续誉,像睡著了一般莱没。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酷鸦,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天饰躲,我揣著相機與錄音,去河邊找鬼井佑。 笑死属铁,一個胖子當著我的面吹牛,可吹牛的內容都是我干的躬翁。 我是一名探鬼主播焦蘑,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盒发!你這毒婦竟也來了例嘱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宁舰,失蹤者是張志新(化名)和其女友劉穎拼卵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛮艰,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡腋腮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了壤蚜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片即寡。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袜刷,靈堂內的尸體忽然破棺而出聪富,到底是詐尸還是另有隱情,我是刑警寧澤著蟹,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布墩蔓,位于F島的核電站,受9級特大地震影響萧豆,放射性物質發(fā)生泄漏奸披。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一涮雷、第九天 我趴在偏房一處隱蔽的房頂上張望源内。 院中可真熱鬧,春花似錦、人聲如沸膜钓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颂斜。三九已至夫壁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沃疮,已是汗流浹背盒让。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留司蔬,地道東北人邑茄。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像俊啼,于是被迫代替她去往敵國和親肺缕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容