數組越界與緩沖區溢出


 數組下標越界(Index out of bounds)對初學者來說是很易犯的錯誤。先來看數組下標越界的例子。

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int i, a, s[5], b;
 5 
 6     printf("%p %p %p\n", &a, s, &b);
 7     a = b = 1;
 8 
 9     for(i = -1; i <= 5; i++)
10         s[i] = 2;
11     printf("%d %d %d %d\n", a, s[0], s[4], b);
12 
13     return 0;
14 }

 

程序輸出如下

0022FF48 0022FF34 0022FF30
2 2 2 2

存儲空間圖示如下,可以看到b恰好在數組的前面,而a正好在數組的后面。

s[i]=*(s+i), 所以s[-1]正好是b,s[5]正好是a。而-1,5兩個下標不在數組的有效下標中。在現實中經常可以看到編程人員控制不好s[i]中的i, 導致i越界,有些語言(如Java)運行時刻會對此進行檢查,但是C不會。

 

緩沖區溢出(buffer overflow, or buffer overrun)是指寫數據到緩沖區(很多情況可以看成數組)時,越過緩沖區的邊界寫入其鄰接的存儲區域的現象。

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4    char a, s[5], b;
 5 
 6    a = b = '@';
 7    gets(s);
 8    printf("%p %p %p\n", &a, s, &b);
 9    printf("%c %s %c\n", a, s, b);
10 
11    return 0;
12 }

 輸入下面的內容

abcdefg

程序的輸出如下
0022FF4F 0022FF4A 0022FF49
f abcdefg @

存儲空間圖示如下,字符數組s容納不下"abcdefg", 字符a的內容被重寫成了f。 

可以看到,gets沒有檢查數組的邊界,放任多余的內容寫到了數組s的鄰接區域。你可以嘗試輸入更多的數據,看看有什么情況會發生。

 

以上代碼的輸出均在CodeBlocks 13.12平台上產生。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM