局部变量太大导致栈溢出
问题:
昨天,有同学遇到栈溢出的问题。在做大三小学期项目时,需要一个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
用来记录一个对进程