在linux中,至少在SUSE / SLES版本11中,如果你键入' limit'它会回复
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8192 kbytes
coredumpsize 1 kbytes
memoryuse 449929820 kbytes
vmemoryuse 423463360 kbytes
descriptors 1024
memorylocked 64 kbytes
maxproc 4135289
maxlocks unlimited
maxsignal 4135289
maxmessage 819200
maxnice 0
maxrtprio 0
maxrttime unlimited
这些是我在/etc/security/limits.conf中的默认设置
我有一个C程序,大约5500行代码,最小的注释。 我声明了一些大数组,该程序处理网格结构,因此有一个结构化的节点"具有double类型的x,y,z变量的数组,以及一些其他整数和双变量(如果需要)。并且有一个结构化的元素"具有整数类型的n1,n2,n3变量的数组。在许多函数中,我将声明类似
的内容struct NodeTYPE nodes[200000];
struct ElemTYPE elements[300000];
运行程序时,会吐出一个菜单来选择要执行的操作,然后输入一个数字。输入1然后调用某个函数,输入2个调用某些不同的函数,依此类推。它们中的大多数都可以工作,但有一个没有,并且一旦调用函数就调试程序,它就会出现分段错误。
如果我修改/etc/security/limits.conf并执行
* hard stacksize unlimited
* soft stacksize unlimited
然后程序无需更改代码中的任何内容即可运行,无需重新编译。该程序通过
编译gcc myprogram.c -O2 -o myprogram.x -lm
有人可以详细解释为什么会发生这种情况, 什么是解决此类问题的最佳方法?
我的编程是否导致分段错误? 我想在过去说...当我想出使stacksize无限制...如果我把我的大数组全局放在main()之外的程序中那么程序就不会出错...只有当那些大数组声明属于导致此问题的函数。
堆栈大小限制为8MB非常小(我的系统有超过128GB的RAM)?