先來看段程式,為了構造符合目的的場景,我們構造了兩個全域性變數陣列,確保位址連續(網上查了下,這種說法是不對的,但是在我使用的ide–vs2013中,貌似是這樣的,還請大神指正)。
#include
#include
using
namespace
std;
int aa[5] = ;
int bb[5] = ;
int main()
; int *c;
c = &a[4] + 1;
/*for (int i = 0; i < 5; i++)
*/}
上述程式沒有報錯,同時bb[1]的資料的確變成了10,這說明陣列下標越界不一定會引起程式執行失敗。
這就奇怪了呀,為什麼有時候,當下標越界時會產生執行錯誤,而這種情況下卻沒有問題呢?原來啊,是因為兩個陣列在記憶體位址上是連續的。我們在宣告int aa[5]和int bb[5]時其實是宣告了10個變數,這些變數在位址上連續。宣告變數的作用就是申請了一塊位址,然後當我們操作這塊位址時,就被認為是合法的,但是當我們操作一塊未被宣告位址時,就會發生執行時錯誤。所以aa[6]這塊記憶體,其實就是bb[1],是已經宣告過的合法記憶體,我們可以像操作普通int型別變數一樣對他進行處理。
再看我們注釋的地方,如果取消注釋,執行程式時就會報錯。這是因為那些位址沒有宣告,是非法的,不能進行寫操作。想想我們過去運用指標,都是進行了如下的操作:
int a;
int*p=&a;
*p=1;
這裡面,變數a宣告過,其位址已經是合法的,&a只是取了這塊位址,並將其賦給p,操作的其實還是合法的位址。(報的錯誤型別為run-time check failure #2 - stack around the variable 」 was corrupte ,意思是我們的程式中,在某個變數附近的記憶體被破壞了。還有一點需要注意的是,通過debug可以發現,丟擲異常的地方大多不是越界訪問的地方。)
上述內容講了陣列越界不會產生執行時錯誤的原因,這節講講該如何預防。很簡單,就是每次獲得陣列下標時,都先判斷該下標值是不是在陣列的正確的下標範圍內,這樣可以有效地降低錯誤。
c 陣列越界相關
標籤 空格分隔 問題少年系列 今天同學問我乙個很細節的問題,覺得提問那個人提不錯的 include stdafx.h include using namespace std int main cout cout return 0 我也很疑惑,所以查了一下 棧是由高往低增長的,而陣列的儲存是由低位往高...
c 陣列訪問越界的問題
include stdafx.h int main 如上 中,對b的賦值顯然超出了b所包含的記憶體空間,所以a的值被破壞了。多說一句 求陣列長度可以用如下 include stdafx.h int main 要注意的是sizeof是關鍵字,而不是函式,該關鍵字的返回值在編譯的時候就已經被確定。在c9...
c語言陣列越界的避免方法
1 盡量顯式地指定陣列的邊界 define max 10 int a max 在 c99 標準中,還允許我們使用單個指示符為陣列的兩段 分配 空間,如下面的 所示 int a max 在上面的 a max 陣列中,如果 max 大於 10,陣列中間將用 0 值元素進行填充 填充的個數為 max 10...