C 陣列越界實驗

2022-05-29 06:42:07 字數 1269 閱讀 6851

請先看一到程式:

程式試圖給長度為10的字串str拷貝超過10個長度的字串,不少初學者可能忘記了陣列開闢的長度或是沒有意識到越界的問題引發這樣的錯誤寫法,可能更令新人詫異的是,這樣的寫的程式竟然編譯器不報錯,並且執行也不報錯! 大家可以自行嘗試執行這個程式,不僅編譯沒有問題,執行也看起來一切「正常」!

這就是乙個典型的陣列越界引發的問題,如果大家細心讀程式觀察結果,就會發現雖然str字串的內容沒有問題,但旁邊的整形變數a似乎有點「搶鏡」哦,原來是5,可現在竟然輸出0! 再看看**,又沒有被賦值,就莫名由5改成了0!真是躺著也中槍啊!

那這裡為什麼a的值被更改了呢?下面我們為大家詳細解釋!

若要查明這個原因,大家可以跟蹤記憶體,尤其變數a的位置便可以查明一二。

如圖,strcpy函式前下斷點,首先確認a的值和str的初始值:

可以看到str位址0x0019ff30處還未初始化,而a的位址為0x0019ff3c且初始化為5,沒有問題!

看到str陣列已經被初始化為0(紅色部分佔10個位元組),注意此時的a距離str最後乙個元素也就是str[9]的位置也就三個位元組! 現在大家可以偷偷再數一數strcpy給str拷貝的字串長度為12個…咳咳

那麼繼續下一步,繼續觀察:

注意,問題來了! strcpy這一步直接導致從0x0019ff30處開始的13個位元組全部更改,並且波及到了a的位址0x0019ff3c處,仔細觀察分析內容可以看到前12個分別為123456789123這12個數的asc碼,而第13個位元組的內容則為字串結尾的』\0』所致!使得第13個位元組處的內容也就是a的位址也被字串末尾的\0進行覆蓋,所以原來的5被0覆蓋!這就是a躺著也中槍的真實原因! 超長的字串加上結尾的\0使得下乙個變數的值也受到了影響!

c 陣列越界相關

標籤 空格分隔 問題少年系列 今天同學問我乙個很細節的問題,覺得提問那個人提不錯的 include stdafx.h include using namespace std int main cout cout return 0 我也很疑惑,所以查了一下 棧是由高往低增長的,而陣列的儲存是由低位往高...

C陣列下標越界

之前總聽說c語言的各種毛病,今天算是遇到乙個 陣列下標越界 兩段完成不相干的 一段是測溫度的,一段是測轉速的。兩段 單獨執行都沒有問題,但是若執行測轉速的 測溫度的資料就會發生錯誤。一步檢視,發現執行測轉速之後,測溫度的 中的乙個變數和乙個資料的值就會發生詭異的錯誤 陣列下標越界 這個越界非常不明顯...

C 陣列越界,陣列進棧

首先,展示一段最常見的陣列越界。先定義int型的變數i,再定義整型陣列,長度為10,然後for迴圈時,給i初始化,即i 0,判斷i 10,若為真,則給陣列中的所有值賦值為0,然後依次輸出i的變化 否則,迴圈結束。如下 include int main 結果如下圖 編譯器 visual studio ...