久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2516|回復: 0
打印 上一主題 下一主題
收起左側

C語言:數組越界與溢出

[復制鏈接]
跳轉到指定樓層
樓主
數組越界C語言數組是靜態的,不能自動擴容,當下標小于零或大于等于數組長度時,就發生了越界(Out Of Bounds),訪問到數組以外的內存。如果下標小于零,就會發生下限越界(Off Normal Lower);如果下標大于等于數組長度,就會發生上限越界(Off Normal Upper)。
C語言為了提高效率,保證操作的靈活性,并不會對越界行為進行檢查,即使越界了,也能夠正常編譯,只有在運行期間才可能會發生問題。請看下面的代碼:
#include <stdio.h>
int main()
{
int a[3] = {10, 20, 30}, i;
for(i=-2; i<=4; i++){
printf("a[%d]=%d\n", i, a[ i]);
}
return 0;
}
運行結果:a[-2]=-858993460a[-1]=-858993460a[0]=10a[1]=20a[2]=30a[3]=-858993460a[4]=-858993460
越界訪問的數組元素的值都是不確定的,沒有實際的含義,因為數組之外的內存我們并不知道是什么,可能是其它變量的值,可能是函數參數,可能是一個地址,這些都是不可控的。
由于C語言的”放任“,我們訪問數組時必須非常小心,要確保不會發生越界。每個C語言程序員的生涯中都遇到過越界錯誤,因為越界錯誤有時候不容易發現,也不容易復現。
當發生數組越界時,如果我們對該內存有使用權限,那么程序將正常運行,但會出現不可控的結果(如上例所示);如果我們對該內存沒有使用權限,或者該內存壓根就沒有被分配,那么程序將會崩潰。請看下面的例子:
#include <stdio.h>
int main()
{
int a[3];
printf("%d", a[10000]);
return 0;
}
在 VS2010 下運行,會出現運行時錯誤:


在 C-Free 5.0 下運行,會彈出程序停止工作的對話框:
每個程序能使用的內存都是有限的,該程序要訪問 4*10000 字節處的內存,顯然太遠了,超出了程序的訪問范圍。這個地方的內存可能沒有被分配,可能是系統本身占用的內存,可能是其它數據的內存,如果放任這種行為,將帶來非常危險的后果,操作系統只能讓程序停止運行。
數組溢出當賦予數組的元素個數超過數組長度時,就會發生溢出(Overflow)。如下所示:int a[3] = {1, 2, 3, 4, 5};數組長度為3,初始化時卻賦予5個元素,超出了數組容量,所以只能保存前3個元素,后面的元素被丟棄。
GCC、LLVM/Clang、低版本的 VS(例如 VS2010)發現數組溢出只會給出警告,并不會報錯。但是高版本的 VS(例如 VS2015、VS2017)發現數組溢出時會報錯,禁止編譯通過,微軟終于聰明了一次。
一般情況下數組溢出不會有什么問題,頂多是丟失多余的元素。但是當以字符串的形式輸出字符數組時,就會產生不可控的情況,請看下面的代碼:
#include <stdio.h>
int main()
{
char str[10] = "88888888888888888888";
puts(str);
return 0;
}
在 DEV下的運行結果:


字符串的長度大于數組長度,數組只能容納字符串的前面一部分,也就是"http://c.b",即使編譯器在最后添加了'\0',它也保存不到數組里面,所以 printf() 掃描數組時不會遇到結束符'\0',只能繼續向后掃描。而后面內存中的數據我們不知道是什么,字符能否識別,何時遇到'\0',這些都是不確定的。當字符無法識別時,就會出現亂碼,顯示奇怪的字符。
由此可見,在用字符串給字符數組賦值時,要保證數組長度大于字符串長度,以容納結束符'\0'。
總結:能夠理解數組越界和數組溢出的原因,并且在編程中注意避免。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品久久久久久久久中文字幕 | 成年人国产在线观看 | 日韩欧美精品在线 | 成人国产精品入口免费视频 | 中文字幕一区二区在线观看 | 男女免费观看在线爽爽爽视频 | 成人精品一区二区三区中文字幕 | 中文字幕一区在线观看视频 | 成人国产午夜在线观看 | 国产高清久久久 | 天天综合日日夜夜 | 成人3d动漫一区二区三区91 | 一级毛片视频在线 | 欧美h| 亚洲成人自拍 | 国产精品99久久久久久久vr | 一区二区三区精品在线 | 青青草原综合久久大伊人精品 | 四虎精品在线 | 成人精品网 | 日韩中文字幕在线免费 | 久久亚洲国产精品 | 99国产精品视频免费观看一公开 | 99精品在线| 日韩欧美在线免费 | 欧美亚洲一区二区三区 | 九九综合九九 | 成人精品区 | 天天操综合网站 | 玖玖操| 91免费看片 | 日日骚网 | 欧美日韩国产传媒 | 日本在线中文 | 免费黄色大片 | 日韩欧美网 | 久久久久久高清 | 麻豆毛片 | 韩日一区二区三区 | 在线观看免费国产 | 国产乱码精品1区2区3区 |