c 陣列越界引起的感悟以及相關保護措施

2021-08-27 11:04:09 字數 1081 閱讀 1130

先來看段程式,為了構造符合目的的場景,我們構造了兩個全域性變數陣列,確保位址連續(網上查了下,這種說法是不對的,但是在我使用的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...