c語言陣列(指標)越界訪問,C語言陣列(指標)越界訪問

2021-12-25 03:29:09 字數 2338 閱讀 3456

1樓:匿名使用者

與編譯器無關,只與記憶體管理機制有關,是作業系統級別的問題,堆疊的讀取方式只是資料結構上的不同,在機器層面,依然是單純的記憶體讀寫操作;

陣列越界訪問的危險性不好評估,但確實是最嚴重的危險之一;

結果基本上會100%崩潰,但是崩潰的原因很可能不一樣,就算是同一段越界**跑幾遍,原因也可能是不一樣的;

指標越界問題是不限於陣列訪問的,所以全面點的解釋如下:

c語言的編譯時,會跟你的**需要,首先申請一塊棧空間和堆空間,棧的優先順序較高,一般時存放程式執行所必須的資料和變數,記憶體上是連續的,堆空間是程式執行時動態申請的空間,記憶體上一般是不連續的,這裡說的棧與你自己建立的棧不是一個棧,不過資料結構是一樣的,只不過你自己建立的棧是靠你自己寫的**動態建立的,所以其實是在你程式的堆空間中的;

下面關鍵問題來了,

以上所有記憶體空間就是你的程式在跑起來之後,向作業系統申請的所有空間,換句話說,這些記憶體以外的資料,都是不屬於你這個程式的資源,當你使用指標操作的時候,如果你的指標越界了,那麼接下來你對這個指標的操作就是非法的了,如果這段空間依然是你程式內部的資源,通常會導致你程式自己崩潰,如果是程式之外的資源一般就更糟糕了,甚至會導致更高階別的崩潰,原因很多:

比如你篡改了不屬於你的資料,導致該資料所屬物件的邏輯混亂;

比如越界區域存在保護,記憶體空間是有讀寫許可權控制的,如果接下來你對只讀的空間進行寫操作,也會導致崩潰,windows下你會看到非常親切的藍屏;

等等...

這也是記憶體溢位攻擊的基本思想;

2樓:風若遠去何人留

陣列(指標)越界訪問,是指使用了超過有效範圍的偏移量。

如只分配了10個元素的空間,但是訪問了第11個元素,就屬於越界。

當出現越界時,由於無法得知被訪問空間儲存的內容及功能,所以會出現不可預知後果。可能程式崩潰,可能運算結果非預期,也可能完全沒有影響。

在程式設計時要避免指標越界訪問,對於用變數作為引數訪問元素時,需要控制好變數範圍。如果變數值由外部因素決定,那麼訪問前先對合法性做判斷,防止越界。

3樓:擺渡人生

簡單的說 越界訪問 就是超出他分配的範圍 越界後讀取的值或寫入的值得地址是隨機的 所謂風險就是可能會篡改誤讀到一些你個人 或系統內部的一些重要資料資訊 導致程式出錯等非正常現象 一般寫程式不是大型的話 危險性一般不大 因為編譯器會做出提示或保護等措施。。

4樓:

你的想法很好,很超前,\,呵呵

但是又有什麼意義呢

這個錯誤,系統會捕捉嗎,反正cpu是不捉不了的,就算強行的通過了檢查.

除了增加風險和**的難讀性,還有什麼別的用嗎.

如果沒用就不要研究了.

c語言指標越界問題,大神指教!!!

5樓:

int *p;   //這樣寫才對

int a[10];

p = a;

c語言陣列下標越界問題

6樓:光輝歲月

首先:陣列下標是從0開始的;所以a【】的下表是從0…9的, 即a[10]=a[9]是錯誤的。a指的是a[9]後面的那個儲存單元的的數值。

其次:void fun( int a, int n, int m)

這個j是多餘的。

7樓:

void fun( int a, int n, int m)

第一個括號是全形的括號!!!

還有陣列訪問越界 編譯器是不提示的

8樓:匿名使用者

c++中,並不會自動檢查下標越界問題。

第一個程式中,a[10]=a[9],改變了不屬於陣列空間的記憶體單元。這個錯誤不會在編譯和連線中反應出來,而是會一直執行下去,知道出現結果不正確。嚴重時可能導致宕機。

第二個程式也是同樣道理,陣列a只申請了三個整形的記憶體空間,越界的部分修改了記憶體中原來的資料。不過在這裡編譯會報錯。

要保證不破壞其他儲存空間中的資料只能說自己注意了。

9樓:

for ( i=m ; i>=n ; i-- ) a[i+1]=a[i] ;

這句話有錯。i =9時 i+1就是10;你定義的陣列只有10個元素。a[i+1]是啊a[10]是第十一個元素。陣列下標越界。

10樓:匿名使用者

明明知道是錯了 何必去研究這些錯誤的問題呢?至於如何保證a[10]就沒有破壞其他儲存空間中的資料呢??將 #define n 10 改為#define n 11 就可以了!

最後輸出應該為 12334

C語言的問題,指標陣列,c語言指標陣列

改變不了,字串常量是改不了的,你可以試試char p aaaaa p 1 b 這樣是改不了的 只能定義二維陣列才可以改 char p 3 100 這樣才可以改,不要問為什麼,字串常量就是不能改 直接讓指標指向另一個字串即可 p 0 aaaa 這樣定義指標指向的字串是無法修改的。c語言指標陣列 p是i...

C語言指標越界問題,大神指教,求c語言大神指教指標問題

p是指向int型別的指標,a為陣列首地址,這些理解都是對的,但是,p沒有被初始化 啊,你能直接是用沒有被初始化的變數嘛,那肯定是不行的啊.所以正確的做法先給p繫結堆記憶體就可以這樣寫了.include using namespace std int main p array cout p 1 end...

C語言指標問題,C語言指標問題

include int main void max min sz 0 for i 1 ip i printf max d position d n max,j 1 printf min d position d n min,k 1 return 0 c語言指標問題 10 最好貼上完整程bai序 或標...