C語(yǔ)言陷阱與缺陷之?dāng)?shù)組越界訪問(wèn)詳解
1.問(wèn)題引入
一道經(jīng)典的筆試題來(lái)了,請(qǐng)做好準(zhǔn)備?。?!
試問(wèn)以下代碼在Visual studio 2019環(huán)境下執(zhí)行結(jié)果?原因?
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = {0};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("Hello World!\n");
}
return 0;
}運(yùn)行結(jié)果:

想不到吧為什么會(huì)造成死循環(huán)里???
疑惑鴨???
這樣一個(gè)看似淺顯的代碼卻存在一個(gè)大大的陷阱等著你,讓我們一起來(lái)分析哈!
2、問(wèn)題分析
(1)理論分析
很顯然出現(xiàn)了數(shù)組越界訪問(wèn)但是為什么會(huì)造成死循環(huán)里???
首先我們知道局部變量在存在棧區(qū)中,存儲(chǔ)方式為先使用高地址再使用低地址,然而數(shù)組存儲(chǔ)方式開辟一塊地址然后地址由低到高依次存儲(chǔ)。

這樣在越界訪問(wèn)時(shí)可能會(huì)導(dǎo)致問(wèn)題?。?!
數(shù)組越界訪問(wèn)到Arr[12]會(huì)改變i的值導(dǎo)致了死循環(huán)哈!??!
(2)調(diào)試驗(yàn)證

由此可見(jiàn)i的地址和arr[12]的地址是一樣的,這樣在數(shù)組越界訪問(wèn)中在修改arr[12]的值時(shí)把i的值改掉了,之后每次循環(huán)到此處都產(chǎn)生同樣的結(jié)果造成了死循環(huán)哈!?。?/p>
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C/C++實(shí)現(xiàn)磁盤相關(guān)操作的示例代碼
這篇文章主要為大家詳細(xì)介紹了C/C++如何實(shí)現(xiàn)磁盤相關(guān)操作,例如遍歷磁盤容量、實(shí)現(xiàn)磁盤格式化、移除指定磁盤等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
MFC創(chuàng)建模態(tài)對(duì)話框和非模態(tài)對(duì)話框的方法
這篇文章主要介紹了MFC創(chuàng)建模態(tài)對(duì)話框和非模態(tài)對(duì)話框的方法,需要的朋友可以參考下2014-07-07
QT實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
C++數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)現(xiàn)
線性表的鏈?zhǔn)酱鎯?chǔ)又稱為單鏈表,它是指通過(guò)一組任意的存儲(chǔ)單元來(lái)存儲(chǔ)線性表中的數(shù)據(jù)元素。本文將用C++實(shí)現(xiàn)單鏈表,需要的可以參考一下2022-05-05

