栈的概念以及栈溢出

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

posted @ 2022-04-17 16:01  jarsing  阅读(184)  评论(0编辑  收藏  举报