欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言安全之?dāng)?shù)組長度與指針實(shí)例解析

 更新時(shí)間:2014年07月07日 15:06:03   投稿:shichen2014  
這篇文章主要介紹了C語言安全之?dāng)?shù)組長度與指針,需要的朋友可以參考下

1.C語言編碼需要保證變長數(shù)組的長度參數(shù)位于合法范圍之內(nèi)

例如以下代碼:

void func(size_t s) {
 int vla[s];
 /*...*/
}
/*...*/
func(size);
/*...*/

解決方案如下:

enum {MAX_ARRAY = 1024};
void func(size_t s) {
 if(s < MAX_ARRAY && s != 0) {
  int vla[s];
  /*...*/
 } else {
  //錯(cuò)誤處理
 }
}
/*...*/
func(size);
/*...*/

2.需要保證復(fù)制的目標(biāo)具有足夠的存儲(chǔ)空間

參考代碼如下所示:

enum {WORKSPACE_SIZE = 256};
void func(const int src[], size_t len) {
 int dest[WORKSPACE_SIZE];
 if(len > WORKSPACE_SIZE) {
  //錯(cuò)誤處理
 }
 memcpy(dest, src, sizeof(int) * len);
 /*...*/
}

3.不要把一個(gè)指向非數(shù)組對象的指針加上或減去一個(gè)整數(shù)

錯(cuò)誤代碼如下所示:

struct numbers {
 short num1;
 short num2;
 /*...*/
 short num9;
};
int sum_numbers(const struct numbers *numb) {
 int total = 0;
 const int *numb_ptr;
 for(numb_ptr = &numb->num1; numb_ptr <= &numb->num9; numb_ptr++) {
  total += *(numb_ptr);
 }
 return total;
}
int main(void) {
 struct numbers my_numbers = {1,2,3,4,5,6,7,8,9};
 sum_numbers(&my_numbers);
 return 0;
}

上面的代碼試圖用指針運(yùn)算訪問結(jié)構(gòu)的元素,這是危險(xiǎn)的,因?yàn)榻Y(jié)構(gòu)中的字段并不保證在內(nèi)存中是連續(xù)的

解決方案(使用數(shù)組)如下:

struct numbers {
 short num1;
 short num2;
 /*...*/
 short num9;
};
int sum_numbers(const short *numb, size_t dim) {
 int total = 0;
 const int *numb_ptr;
 for(numb_ptr = numb; numb_ptr < numb + dim; numb_ptr++) {
  total += *(numb_ptr);
 }
 return total;
}
int main(void) {
 short my_numbers[9] = {1,2,3,4,5,6,7,8,9};
 sum_numbers(my_numbers, sizeof(my_numbers) / sizeof(my_numbers[0]));
 return 0;
}

相關(guān)文章

  • C語言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放

    C語言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放

    這篇文章主要介紹了C語言之malloc動(dòng)態(tài)分配內(nèi)存和free釋放,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • C語言數(shù)據(jù)存儲(chǔ)歸類介紹

    C語言數(shù)據(jù)存儲(chǔ)歸類介紹

    使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-08-08
  • 深入解析int(*p)[]和int(**p)[]

    深入解析int(*p)[]和int(**p)[]

    以下是對int(*p)[]和int(**p)[]的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C語言詳解無頭單向非循環(huán)鏈表各種操作方法

    C語言詳解無頭單向非循環(huán)鏈表各種操作方法

    無頭單向非循環(huán)鏈表:結(jié)構(gòu)簡單,一般不會(huì)單獨(dú)用來存數(shù)據(jù)。實(shí)際中更多是作為其他數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),如哈希桶、圖的鄰接表等等。另外這種結(jié)構(gòu)在筆試面試中出現(xiàn)很多
    2022-04-04
  • C++實(shí)現(xiàn)八皇后問題的方法

    C++實(shí)現(xiàn)八皇后問題的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)八皇后問題的方法,是數(shù)據(jù)結(jié)構(gòu)與算法中常見的一個(gè)經(jīng)典算法,需要的朋友可以參考下
    2014-09-09
  • C++分析構(gòu)造函數(shù)與析造函數(shù)的特點(diǎn)梳理

    C++分析構(gòu)造函數(shù)與析造函數(shù)的特點(diǎn)梳理

    本文對類的構(gòu)造函數(shù)和析構(gòu)函數(shù)進(jìn)行總結(jié),主要包括了構(gòu)造函數(shù)的初始化、重載、使用參數(shù)和默認(rèn)參數(shù),拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù),希望能幫助讀者在程序開發(fā)中更好的理解類,屬于C/C++基礎(chǔ)
    2022-05-05
  • 你知道C語言中#和##表示的意義嗎

    你知道C語言中#和##表示的意義嗎

    如標(biāo)題,這篇文章會(huì)講解C語言中的#和##是啥意思。我相信,大部分朋友應(yīng)該都沒怎么用過,這兩個(gè)玩意的使用條件也相當(dāng)苛刻,快跟隨小編一起來看看吧
    2023-04-04
  • c++數(shù)組排序的5種方法實(shí)例代碼

    c++數(shù)組排序的5種方法實(shí)例代碼

    大家還在為大小排序而煩惱嗎?今天讓我我大家解決這個(gè)問題吧,下面這篇文章主要給大家介紹了關(guān)于c++數(shù)組排序的5種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • C語言單鏈表常見操作匯總

    C語言單鏈表常見操作匯總

    這篇文章主要介紹了C語言單鏈表常見操作,需要的朋友可以參考下
    2014-07-07
  • C語言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)

    C語言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論