C語言陷阱與缺陷之?dāng)?shù)組越界訪問詳解
1.問題引入
一道經(jīng)典的筆試題來了,請做好準(zhǔ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; }
運行結(jié)果:
想不到吧為什么會造成死循環(huán)里???
疑惑鴨???
這樣一個看似淺顯的代碼卻存在一個大大的陷阱等著你,讓我們一起來分析哈!
2、問題分析
(1)理論分析
很顯然出現(xiàn)了數(shù)組越界訪問但是為什么會造成死循環(huán)里???
首先我們知道局部變量在存在棧區(qū)中,存儲方式為先使用高地址再使用低地址,然而數(shù)組存儲方式開辟一塊地址然后地址由低到高依次存儲。
這樣在越界訪問時可能會導(dǎo)致問題?。?!
數(shù)組越界訪問到Arr[12]會改變i的值導(dǎo)致了死循環(huán)哈?。?!
(2)調(diào)試驗證
由此可見i的地址和arr[12]的地址是一樣的,這樣在數(shù)組越界訪問中在修改arr[12]的值時把i的值改掉了,之后每次循環(huán)到此處都產(chǎn)生同樣的結(jié)果造成了死循環(huán)哈?。?!
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C/C++實現(xiàn)磁盤相關(guān)操作的示例代碼
這篇文章主要為大家詳細介紹了C/C++如何實現(xiàn)磁盤相關(guān)操作,例如遍歷磁盤容量、實現(xiàn)磁盤格式化、移除指定磁盤等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法
這篇文章主要介紹了MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法,需要的朋友可以參考下2014-07-07C++數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)
線性表的鏈?zhǔn)酱鎯τ址Q為單鏈表,它是指通過一組任意的存儲單元來存儲線性表中的數(shù)據(jù)元素。本文將用C++實現(xiàn)單鏈表,需要的可以參考一下2022-05-05