1樓:
第乙個和第二個陣列a[2]按指標說就是指向a[1]也就是30的記憶體下乙個位置,兩種程式排列不一樣,第二個下乙個應該是i的位置,第乙個不一定,可能是堆裡面的隨機數。
2樓:匿名使用者
恩。打個比方說有一天你去賓館訂了個房間。然後再牆壁上鑿了個洞看隔壁住著誰。
後來又有一天你又去訂了乙個房間,然後又在牆壁上鑿了個洞看隔壁住著誰。
你覺得兩次隔壁會住著同乙個人嗎?
應該說是你就不應該在牆壁上鑿洞……
3樓:
因為你的陣列是包含兩個元素的陣列,但是你訪問了第三個元素,而第三個元素的值陣列a中的30元素的下乙個位址的內容。
根據你的兩個**,第乙個**的記憶體分布是 i(0) 10 30,第二個**的記憶體分布是10,30,i(0)
也就是說,當你訪問第三個元素時,第乙個**得到的結果是乙個不確定的值,在30這個值的記憶體位址的下乙個位址的值,而第二個**得到的結果應該是0.也就是i的值。
4樓:旅楊氏夔儀
c語言編譯器是不會做陣列越界檢查的。
所以我們在寫c程式的時候一定要注意是否會發生越界
5樓:匿名使用者
呵呵 看了半天 才知道你問的是int定義順序為何導致結果不同吧,是因為這個遵循棧的管理原則就是後進先出,後定義先分配。
第乙個在記憶體中是 a的數值 然後是i的數值 你越界訪問a2於是訪問到了i的空間
這時候相當於a[3]=0,運算後a[3]=0-3,此時i=-3,於是繼續迴圈...
第二個在記憶體中是 i的數值 然後是a的數值 你越界訪問a2於是訪問到了不可預料的空間,這個空間鬼知道原來是什麼內容,於是會列印出奇奇怪怪的東西,要是這個空間碰巧是乙個不可讀的空間,將會引發段錯誤。
c語言陣列(指標)越界訪問
6樓:匿名使用者
與編譯器無關,只與記憶體管理機制有關,是作業系統級別的問題,堆疊的讀取方式只是資料結構上的不同,在機器層面,依然是單純的記憶體讀寫操作;
陣列越界訪問的危險性不好評估,但確實是最嚴重的危險之一;
結果基本上會100%崩潰,但是崩潰的原因很可能不一樣,就算是同一段越界**跑幾遍,原因也可能是不一樣的;
指標越界問題是不限於陣列訪問的,所以全面點的解釋如下:
c語言的編譯時,會跟你的**需要,首先申請一塊棧空間和堆空間,棧的優先順序較高,一般時存放程式執行所必須的資料和變數,記憶體上是連續的,堆空間是程式執行時動態申請的空間,記憶體上一般是不連續的,這裡說的棧與你自己建立的棧不是乙個棧,不過資料結構是一樣的,只不過你自己建立的棧是靠你自己寫的**動態建立的,所以其實是在你程式的堆空間中的;
下面關鍵問題來了,
以上所有記憶體空間就是你的程式在跑起來之後,向作業系統申請的所有空間,換句話說,這些記憶體以外的資料,都是不屬於你這個程式的資源,當你使用指標操作的時候,如果你的指標越界了,那麼接下來你對這個指標的操作就是非法的了,如果這段空間依然是你程式內部的資源,通常會導致你程式自己崩潰,如果是程式之外的資源一般就更糟糕了,甚至會導致更高階別的崩潰,原因很多:
比如你篡改了不屬於你的資料,導致該資料所屬物件的邏輯混亂;
比如越界區域存在保護,記憶體空間是有讀寫許可權控制的,如果接下來你對唯讀的空間進行寫操作,也會導致崩潰,windows下你會看到非常親切的藍屏;
等等...
這也是記憶體溢位攻擊的基本思想;
7樓:風若遠去何人留
陣列(指標)越界訪問,是指使用了超過有效範圍的偏移量。
如只分配了10個元素的空間,但是訪問了第11個元素,就屬於越界。
當出現越界時,由於無法得知被訪問空間儲存的內容及功能,所以會出現不可預知後果。可能程式崩潰,可能運算結果非預期,也可能完全沒有影響。
在程式設計時要避免指標越界訪問,對於用變數作為引數訪問元素時,需要控制好變數範圍。如果變數值由外部因素決定,那麼訪問前先對合法性做判斷,防止越界。
8樓:擺渡人生
簡單的說 越界訪問 就是超出他分配的範圍 越界後讀取的值或寫入的值得位址是隨機的 所謂風險就是可能會篡改誤讀到一些你個人 或系統內部的一些重要資料資訊 導致程式出錯等非正常現象 一般寫程式不是大型的話 危險性一般不大 因為編譯器會做出提示或保護等措施。。
9樓:
你的想法很好,很超前,\,呵呵
但是又有什麼意義呢
這個錯誤,系統會捕捉嗎,反正cpu是不捉不了的,就算強行的通過了檢查.
除了增加風險和**的難讀性,還有什麼別的用嗎.
如果沒用就不要研究了.
如何解決c語言陣列越界問題?
10樓:西湖觀柳
這個很難。就連大型的軟體公司產品中,可能都有這樣的錯誤。
預先分配較大的記憶體和對下標進行檢驗,可以在一定程度上避免這個問題。
對邊界要檢查,一定要檢查。
11樓:匿名使用者
用乙個除錯功能好一點的ide
c語言的陣列下標越界問題
12樓:堵飛舟
二維陣列定義的一般形式為:型別說明符 陣列名 [常量表示式][常量表示式]
這兩個常量表示式分別指定了二維陣列的行數和列數,程式編譯時據此向記憶體申請空間。
而引用二維陣列的格式為: 陣列名[行下標][列下標],行下標和列下標都是從0開始排序。這裡的下標和上面的常量表示式意義不同,範圍也不同。
以你給的例子來講:
int b[4][5]是定義乙個名為b的二維陣列,它包含4行5列,共20個元素。如果存放陣列b的首位址為p,則記憶體為陣列分配的空間是p~p+19;陣列b的行下標範圍為0~3,列下標範圍為0~4,位址p+19存放的元素為b[3][4]。如果要引用b[4][5],由於沒有提前向記憶體申請位址,則會隨機指向乙個位址,得到乙個垃圾資料,無法實現我們的目的,我們就說是引用下標越界。
13樓:
記憶體給num分配的儲存位置緊跟陣列a後面,在printf(「%d」, a【num】)時輸出了陣列a後面位址上的內容,即num的值,該值唯讀不可修改
14樓:匿名使用者
明明知道是錯了 何必去研究這些錯誤的問題呢?至於如何保證a[10]就沒有破壞其他儲存空間中的資料呢??將 #define n 10 改為#define n 11 就可以了!
最後輸出應該為 12334
15樓:
void fun( int a, int n, int m)
第乙個括號是全形的括號!!!
還有陣列訪問越界 編譯器是不提示的
16樓:
這個不行吧,就像上面兩位說的不同編譯器初始化的值可能不同,即使是這樣初始化的,有可能其它陣列或變數定義在這塊地方,使得數值就會出現錯誤。你可以考慮用for迴圈定義好後使用,如果陣列大小不明,應使用動態maloc,caloc定義。
17樓:匿名使用者
越界陣列的值是不確定的,win7下 vs2008編譯執行以下**#include
int a[10];
void main()
前面3行輸出 0
第4行就出錯強行關閉程式了
18樓:匿名使用者
c++中,並不會自動檢查下標越界問題。
第乙個程式中,a[10]=a[9],改變了不屬於陣列空間的記憶體單元。這個錯誤不會在編譯和連線中反應出來,而是會一直執行下去,知道出現結果不正確。嚴重時可能導致宕機。
第二個程式也是同樣道理,陣列a只申請了三個整形的記憶體空間,越界的部分修改了記憶體中原來的資料。不過在這裡編譯會報錯。
要保證不破壞其他儲存空間中的資料只能說自己注意了。
19樓:匿名使用者
for(int i=0;i<10;i++)
程式一般是這樣寫,0剛好是陣列第乙個元素,10剛好是陣列的最後乙個元素加1。
陣列的使用不能越界,定義多少用多少,定義了10,就只能用0~9。要是這樣亂用的話,在堆疊中有新的陣列分配使用時,會將你亂用的空間毀掉,你上面能成功時因為你使用的陣列就得這個而已。
c語言中的指標陣列和陣列指標的區別
指標陣列 陣列裡的每乙個元素都是指標如 p 10 裡面的 p 0 到 p 9 都是指標 可參考 http baike.陣列指標 指向乙個陣列的指標,如 arr 10 是乙個陣列,讓乙個指標指向這個陣列 p arr 訪問時通過 p n 或 p n 訪問元素值,n為元素索引值 可參考 http baik...
陣列指標和指標陣列的區別,c語言中的指標陣列和陣列指標的區別
int a 3 4 這個bai無需多說,就du是乙個二zhi維陣列。int p 4 就相當於daoint p 4 它就是乙個二維陣列的指標,可以 專指向乙個第屬二維度為4的二維陣列。而a就是這樣的陣列,因而下面是合法的。p a int p 3 是指標陣列。說白了,就是定義了三個指標,分別為p 0 p...
c語言程式設計指向結構體陣列的指標,C語言程式設計指向結構體陣列的指標
1 結構體指標其實是乙個指標,它儲存的是指向某個結構體的 位址 所以結構體指標陣列儲存的其實是指向一組結構體的 位址 陣列,它本身並不包含結構體的具體內容 沒有被分配記憶體 2 所以當用到他們時,要麼重定向,比如 d b 讓d指向b,d儲存的是b的位址,這樣就能通過d來呼叫b了 要麼用malloc為...