棧的概念以及棧溢位
阿新 • • 發佈:2022-04-17
棧的概念以及棧溢位
對每個程式來說,棧能使用的記憶體是有限的,一般是 1M~8M,這在編譯時就已經決定了,程式執行期間不能再改變。如果程式使用的棧記憶體超出最大值,就會發生棧溢位(Stack Overflow)錯誤。
一個程式可以包含多個執行緒,每個執行緒都有自己的棧,嚴格來說,棧的最大值是針對執行緒來說的,而不是針對程式。
棧記憶體的大小和編譯器有關,編譯器會為棧記憶體指定一個最大值,在 VC/VS 下,預設是 1M,在 C-Free 下,預設是 2M,在 Linux GCC 下,預設是 8M, 可以ulimit修改。
ulimit -a // 檢視預設棧大小 ulimit -s 65535 // 設定棧大小
1 // c-array.c 2 int main(){ 3 char str[1024*1024*9] = {0}; // 第一個元素賦值0,其餘預設為0 4 return 0; 5 }
1 #gcc -g c-array.c 2 #gdb a.out 3 4 (gdb) r 5 Starting program: /root/clang/a.out 6 7 Program received signal SIGSEGV, Segmentation fault. 8 0x000000000040053c in main () at c-array.c:2 9 2 charstr[1024*1024*9] = {0}; // 第一個元素賦值0,其餘預設為0 10 Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.5.x86_64
可以看到輸出訊號 : SIGSEGV (SIGSEGV是當一個程序執行了一個無效的記憶體引用,或發生段錯誤時傳送給它的訊號)
其他知識:
c語言呼叫shell命令:
1 #include<stdlib.h> 2 main() 3 { 4 system("ls -la ."); 5 }