有關c語言大陣列而導致的棧溢位的問額

2021-10-10 19:18:23 字數 667 閱讀 6594

關於c語言的大陣列而導致的棧溢位問題

c語言占用的記憶體可以分為5個區:

1.**區(text segment):不難理解,就是用於放置編譯過後的**的二進位制機器碼。

2.堆區(heap)用於動態記憶體分配。一般由程式設計師分配和釋放,若程式設計師不釋放,結束程式時有可能由作業系統**。(其實就是malloc()函式能夠掌控的記憶體區域)

3.棧區(stack):由編譯器自動分配和釋放,一般用來存放區域性變數、函式引數

4.全域性初始化資料區/靜態資料區(data segment):存放全域性變數和靜態變數的地方。這個區域被整個程序共享。

5.未初始化的資料區(bss)

已初始化的全域性變數儲存在.data 段中,未初始化的全域性變數儲存在.bss 段中。

一般情況下data segment中的空間大小一般由記憶體大小所決定。

但是stack區非常的小一般就幾m

如果stac區只有3兆的話,也就是說310241024=3,145,728位元組,最多放下786,432個int型的資料。

所以如果想開闢乙個大陣列的話就將其轉向data segmen區 將其轉化為靜態static。

由於陣列定義在函式體內部,導致棧溢位的情況

最近在做清華的一道範圍查詢的題目,由於要求是到500000,所以我就把部分陣列定義在了main函式外面。include include include 陣列在外面8個0,裡面5個0 using namespace std define maxn 500000 void aaa int a cout ...

C語言記憶體篇 10 棧的概念以及棧溢位

程式的虛擬位址空間分為多個區域,棧 stack 是其中位址較高的乙個區域。棧 stack 可以存放函式引數 區域性變數 區域性陣列等作用範圍在函式內部的資料,它的用途就是完成函式的呼叫。棧記憶體由系統自動分配和釋放 發生函式呼叫時就為函式執行時用到的資料分配記憶體,函式呼叫結束後就將之前分配的記憶體...

C語言遇到的陣列溢位問題

今天寫了個判斷陣列中資料的最大值問題的 發現了乙個有趣的情況,陣列溢位值總是乙個 現附上今天寫的判斷陣列最大值的 define crt secure no warnings 1 include includeint main int max num 0 int i 0 for i 0 i sizeo...