1樓:匿名使用者
與編譯器無關,只與記憶體管理機制有關,是作業系統級別的問題,堆疊的讀取方式只是資料結構上的不同,在機器層面,依然是單純的記憶體讀寫操作;
陣列越界訪問的危險性不好評估,但確實是最嚴重的危險之一;
結果基本上會100%崩潰,但是崩潰的原因很可能不一樣,就算是同一段越界**跑幾遍,原因也可能是不一樣的;
指標越界問題是不限於陣列訪問的,所以全面點的解釋如下:
c語言的編譯時,會跟你的**需要,首先申請一塊棧空間和堆空間,棧的優先順序較高,一般時存放程式執行所必須的資料和變數,記憶體上是連續的,堆空間是程式執行時動態申請的空間,記憶體上一般是不連續的,這裡說的棧與你自己建立的棧不是一個棧,不過資料結構是一樣的,只不過你自己建立的棧是靠你自己寫的**動態建立的,所以其實是在你程式的堆空間中的;
下面關鍵問題來了,
以上所有記憶體空間就是你的程式在跑起來之後,向作業系統申請的所有空間,換句話說,這些記憶體以外的資料,都是不屬於你這個程式的資源,當你使用指標操作的時候,如果你的指標越界了,那麼接下來你對這個指標的操作就是非法的了,如果這段空間依然是你程式內部的資源,通常會導致你程式自己崩潰,如果是程式之外的資源一般就更糟糕了,甚至會導致更高階別的崩潰,原因很多:
比如你篡改了不屬於你的資料,導致該資料所屬物件的邏輯混亂;
比如越界區域存在保護,記憶體空間是有讀寫許可權控制的,如果接下來你對只讀的空間進行寫操作,也會導致崩潰,windows下你會看到非常親切的藍屏;
等等...
這也是記憶體溢位攻擊的基本思想;
2樓:風若遠去何人留
陣列(指標)越界訪問,是指使用了超過有效範圍的偏移量。
如只分配了10個元素的空間,但是訪問了第11個元素,就屬於越界。
當出現越界時,由於無法得知被訪問空間儲存的內容及功能,所以會出現不可預知後果。可能程式崩潰,可能運算結果非預期,也可能完全沒有影響。
在程式設計時要避免指標越界訪問,對於用變數作為引數訪問元素時,需要控制好變數範圍。如果變數值由外部因素決定,那麼訪問前先對合法性做判斷,防止越界。
3樓:擺渡人生
簡單的說 越界訪問 就是超出他分配的範圍 越界後讀取的值或寫入的值得地址是隨機的 所謂風險就是可能會篡改誤讀到一些你個人 或系統內部的一些重要資料資訊 導致程式出錯等非正常現象 一般寫程式不是大型的話 危險性一般不大 因為編譯器會做出提示或保護等措施。。
4樓:
你的想法很好,很超前,\,呵呵
但是又有什麼意義呢
這個錯誤,系統會捕捉嗎,反正cpu是不捉不了的,就算強行的通過了檢查.
除了增加風險和**的難讀性,還有什麼別的用嗎.
如果沒用就不要研究了.
c語言指標越界問題,大神指教!!!
5樓:
int *p; //這樣寫才對
int a[10];
p = a;
c語言問題,陣列與指標,C語言陣列和指標的問題
char a computer a指向一個常量字串,常量字串是不能修改的,而你的for迴圈內要修改a指向的這個常量字串,自然要出錯 char a computer 這個a就是個普通陣列了,它的內容是可以改動的,就不會出錯了 因為 a是個指標啊 所以應該賦值賦地址!所以 應該 char a compu...
c語言用指標引用陣列元素,C語言用指標引用陣列元素
琪樂 p 3 是定義一個指向一維陣列的指標,陣列元素為三。也就是說p指向的其實是a 0 a 1 a 2 這樣的形式。p a 其實就是把第0行的首地址賦值給p.所以答案c中p 1 即是把第1行的首地址給p,在此基礎上向後移一位,取出地址中的元素數值。p 1 1 相當於a 1 1 所以是對的。b的形式是...
c語言指標陣列不需要分配記憶體,C語言 指標陣列不需要分配記憶體?
天雲一號 指標陣列是需要分配記憶體單元的。指標陣列表示一個指標型別的陣列,陣列中每個元素都是一個指標,而c語言中指標只佔4個位元組,所以指標陣列所佔的記憶體大小為4 n n為陣列的大小 舉例如下 int a 5 定義一個int型別的指標陣列,共5個元素,每個元素都是一個int型別的指標,共佔用4 5...