栈的概念以及栈溢出

栈的概念以及栈溢出

对每个程序来说,栈能使用的内存是有限的,一般是 1M~8M,这在编译时就已经决定了,程序运行期间不能再改变。如果程序使用的栈内存超出最大值,就会发生栈溢出(Stack Overflow)错误。
一个程序可以包含多个线程,每个线程都有自己的栈,严格来说,栈的最大值是针对线程来说的,而不是针对程序。
栈内存的大小和编译器有关,编译器会为栈内存指定一个最大值,在 VC/VS 下,默认是 1M,在 C-Free 下,默认是 2M,在 Linux GCC 下,默认是 8M, 可以ulimit修改。

ulimit -a   // 查看默认栈大小
ulimit -s 65535 // 设置栈大小
// c-array.c
int main(){
    char str[1024*1024*9] = {0};  // 第一个元素赋值0,其余默认为0
    return 0;
}
#gcc -g c-array.c
#gdb a.out

(gdb) r
Starting program: /root/clang/a.out

Program received signal SIGSEGV, Segmentation fault.
0x000000000040053c in main () at c-array.c:2
2	    char str[1024*1024*9] = {0};  // 第一个元素赋值0,其余默认为0
Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.5.x86_64

可以看到输出信号 : SIGSEGV (SIGSEGV是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号)

其他知识:
c语言调用shell命令:

#include<stdlib.h>
main()
{
    system("ls -la .");
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值