文章參考微信公眾號[嵌入式軟件學習圈]
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)
===========我是華麗的分割線===========
更多知識:
點擊關注專題:嵌入式Linux&ARM
或瀏覽器打開:http://www.reibang.com/c/42d33cadb1c1
或掃描二維碼: