老張:小豆?。】旎貋恚灰J紅燈!
小豆?。侯~...現在又沒有車...
老張:沒有車那也不行!知不知道闖紅燈是很危險的事情!
小豆?。号?..
老張:這是規矩,是我們應該遵守的。不要以為沒有車輛經過就可以闖紅燈了,闖一次沒事,闖兩次沒事,可是一旦出事!那就一定是個大事!可能這輩子你都不會再有機會闖紅燈了!
小豆丁:老張...你不要嚇我...我知道錯了...以后不會了...
老張:其實不僅僅在我們的生活中有些規矩要遵守,在我們寫代碼的過程中,有些問題也不能逾越,這些都是相通的。
小豆丁:哦?代碼中也有不能逾越的規矩?是什么呀?
老張:比如說,數組越界!
小豆丁:什么是數組越界啊?
老張:就是超出數組的下標范圍進行元素使用。
小豆丁:有點迷糊,具體說說唄!
老張:好,那我先問問你,下面這行代碼啥意思?
int arr[4] = {1,2,3,4};
小豆丁:這個難不倒我!這行代碼表示聲明了一個叫做arr的數組,數組有四個元素,每個元素都是整數類型的,四個元素的值分別是1,2,3,4!
老張:嗯,說的不錯,那我在問問你,這四個元素分別怎么表示啊?
小豆丁:想要表示這幾個元素,需要通過數組下標的方式,這四個元素表示起來應該是這個樣子:arr[0]、arr[1]、arr[2]、arr[3]。
老張:那這四個元素在內存分布上有什么特點?。?/p>
小豆丁:它們每個元素在內存中都是占四個字節,并且在內存中是連續排列存在的,一個挨著一個的。
老張:說得對,那我再問你,arr[4]表示啥意思呢?
小豆?。侯~...這個表示應該有問題吧,這個數組一共就是四個元素啊,最后一個元素的下標應該是3啊,arr[4]這種寫法應該會報錯吧!
老張:確定會報錯嗎?
小豆丁:額...我不知道了...
老張:其實這種寫法不會報錯,并且你能順利的給下標為4的這個元素賦值!
小豆丁:為什么?這么神奇嗎?明明數組中不包含這個元素啊!
老張:這就是數組越界問題!我們所列舉的案例中,數組arr一共只有四個元素,下標從0開始,到3結束,而且在數組聲明并初始化的時候,我們會在內存中占用連續的4*4個字節,這16個字節歸數組的4個元素所使用,以后程序中聲明的其他變量也不會占用這里,你可以理解成這四個元素所占用的16個字節是合法的,有正規手續的。而arr[4]這種寫法并不會報錯,它表示的是數組元素arr[3]之后緊鄰的四個字節存儲區。如下圖。
但是這四個字節的存儲區并不是合法的,它不在我們合法分配的16字節之,我們使用arr[4]這個元素相當于我們在非法使用權限范圍之外的存儲空間。那么這塊存儲空間原本存儲的數據是什么我們不知道,可能有用,也可能沒用。我們在給arr[4]這個元素賦值時,會對這塊存儲區里原本的數據進行覆蓋。萬一這里存儲的是有用的數據,造成的后果可能不堪設想!
小豆?。号?,我懂了,這就是數組越界啊,就是超出數組下標范圍去使用非法的存儲區了。
老張:沒錯,就是這個意思,數組越界使用存儲區,如果這塊存儲區被占用,有重要的數據,那么整個程序的運行結果可能會錯誤,甚至整個程序都可能崩潰。就像我們過馬路一樣,不要抱著僥幸的心理去闖紅燈,一旦出現意外,后果可能很嚴重!
小豆丁:老張,我知道了,以后一定會注意的!
老張:其實生活和編程有很多相通的地方,生活懂了,悟了,編程也就通了,順了!
本文發布于:2023-02-28 20:14:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167766448382283.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:數組越界(數組越界如何解決).doc
本文 PDF 下載地址:數組越界(數組越界如何解決).pdf
| 留言與評論(共有 0 條評論) |