棧的概念以及棧溢位

2021-09-24 14:27:28 字數 984 閱讀 2943

對每個程式來說,棧能使用的記憶體是有限的,一般是 1m~8m,這在編譯時就已經決定了,程式執行期間不能再改變。如果程式使用的棧記憶體超出最大值,就會發生棧溢位(stack overflow)錯誤。

乙個程式可以包含多個執行緒,每個執行緒都有自己的棧,嚴格來說,棧的最大值是針對執行緒來說的,而不是針對程式。

棧記憶體的大小和編譯器有關,編譯器會為棧記憶體指定乙個最大值,在 vc/vs 下,預設是 1m,在 c-free 下,預設是 2m,在 linux gcc 下,預設是 8m, 可以ulimit修改。

ulimit -a   // 檢視預設棧大小

ulimit -s 65535 // 設定棧大小

// c-array.c

intmain()

;// 第乙個元素賦值0,其餘預設為0

return0;

}

#gcc -g c-array.c

#gdb a.out

(gdb) r

starting program: /root/clang/a.out

program received signal sigse**, segmentation fault.

0x000000000040053c in main () at c-array.c:2

2 char str[1024*1024*9] = ; // 第乙個元素賦值0,其餘預設為0

missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.5.x86_64

可以看到輸出訊號 : sigse** (sigse**是當乙個程序執行了乙個無效的記憶體引用,或發生段錯誤時傳送給它的訊號)

其他知識:

c語言呼叫shell命令:

#includemain()

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

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

棧溢位和棧記憶體溢位

棧記憶體溢位是指使用者棧的大小最多為8 10mb,分配超過棧大小的變數則會導致棧記憶體溢位。如char c 1024102411 11mb 棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。如char c 10 memset c...

通過記憶體溢位理解棧的概念

棧是一種有限儲存的資料結構 資料只能在棧的頂端進行新增或刪除,遵循lifo 後進先出 原則。棧支援兩種操作push和pop。push 在棧頂新增乙個資料。pop 從棧頂移除乙個資料。接下來我們看一下一段c程式的記憶體結構在函式呼叫和返回時內容是如何變化的。text 包含將要執行的 data 包含程式...