討論乙個堆疊越界的問題

2021-09-12 19:17:20 字數 623 閱讀 1380

我們先看乙個linux下的c**,分析一下執行結果:

1 int main(int argc, char* ar**) ;

4 for(; i<=3; i++)

8 return 0;

9 }​

顯然,由於陣列越界導致行為未知?

其實,行為雖然非法,但並不是未知或者因為非法訪問而退出。

我們知道,在 c 語言中,只要不是訪問受限的記憶體,所有的記憶體空間都是可以自由訪問的。根據陣列定址方式(線性連續),a[3] 也會被定位到某塊不屬於陣列的記憶體位址上,而這個位址正好是儲存變數 i 的記憶體位址,那麼 a[3]=0 就相當於 i=0,所以就會導致**無限迴圈。

看到這裡,應該還有很多疑問,但是還是請先思考一下。

我們再進一步,函式體內的區域性變數存在棧上,且是連續壓棧。在linux程序的記憶體布局中,棧區在高位址空間,從高向低增長。變數 i 和 arr 在相鄰位址,且 i 比 arr 的位址大,所以 arr 越界正好訪問到 i。當然,前提是 i 和 arr 元素同型別,否則那段**仍是未決行為。

討論乙個堆疊越界的問題

我們先看乙個linux下的c 分析一下執行結果 1 int main int argc,char ar 4 for i 3 i 8 return 0 9 顯然,由於陣列越界導致行為未知?其實,行為雖然非法,但並不是未知或者因為非法訪問而退出。我們知道,在 c 語言中,只要不是訪問受限的記憶體,所有的...

討論乙個堆疊越界的問題

我們先看乙個linux下的c 分析一下執行結果 1 int main int argc,char ar 4 for i 3 i 8 return 0 9 顯然,由於陣列越界導致行為未知?其實,行為雖然非法,但並不是未知或者因為非法訪問而退出。我們知道,在 c 語言中,只要不是訪問受限的記憶體,所有的...

論壇上乙個討論String的問題

public class test public static void main string args 問題是列印結果為什麼為null。很多人討論的結果是由於string屬於乙個immutable類,因此當改變其內容時返回的實際上是乙個新物件的引用。這個問題應該跟string是什麼型別沒有關係的...