局部变量太大导致栈溢出

本文探讨了由于栈中定义大型局部数组导致的栈溢出问题。介绍了操作系统如何管理进程栈,以及栈溢出的原理。提供了解决方案,包括增大栈大小、使用堆内存和静态内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

局部变量太大导致栈溢出


问题:

昨天,有同学遇到栈溢出的问题。在做大三小学期项目时,需要一个750x750的矩阵。于是在栈中定义了一个二维数组。为了说明问题,做如下简化:

/*
测试环境:
window平台 vs2013
*/

int main()
{
    //占用栈内存,局部变量,太大,栈溢出
    double test[750][750];

    return 0; 
}

这看似没有问题,定义了一个变量,不大,才4.5M左右。可是,当运行时出现了栈溢出。什么情况?

编译器和操作系统背后的原理:

操作系统为例实现对用户程序的管理,使用进程+线程来运行我们的程序。涉及到线程,必须得考虑操作系统和编译器。
操作系统,例如Linux,使用vm_area_struct结构体来管理用户空间,在加载一个elf或其他格式的可执行文件时总是会参考文件中给出的信息来设置这个结构体中的内容。其中代码和只读数据段可能就由同一个vm_area_struct来管理、栈区由另一个vm_area_struct来管理、堆区也有一个vm_area_struct、共享区有一个vm_area_struct、映射文件有自己vm_area_struct。所有的vm_area_struct按地址大小连成一个vm_area_struct链表。如果vm_area_struct过多,貌似超过32个时,操作系统就会为其建立一个红黑树,加快查找过程。
task_struct中有一个数组rlim用来记录一个对进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值