1. 程式人生 > 其它 >棧的概念以及棧溢位

棧的概念以及棧溢位

棧的概念以及棧溢位
對每個程式來說,棧能使用的記憶體是有限的,一般是 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        char
str[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 }

 

原文連結:https://blog.csdn.net/u010145312/article/details/92848477?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscanv2&utm_relevant_index=1