栈的概念以及栈溢出
栈的概念以及栈溢出
对每个程序来说,栈能使用的内存是有限的,一般是 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 }