有一个关于 Linux 内存管理的很好的讨论——特别是堆栈——在这里:9.7 Stack overflow,值得一读。
您可以使用此命令找出您当前的堆栈soft limit
是什么
ulimit -s
在 Mac OS X 上,硬限制为 64MB,请参阅如何在 Mac OS X 上使用 ulimit 或每个进程更改堆栈大小以获取 C 或 Ruby 程序?
您可以在程序运行时修改堆栈限制,请参阅使用 GNU 编译器编译期间在 Linux 中更改 C++ 应用程序的堆栈大小
我将您的代码与那里的示例结合在一起,这是一个工作程序
#include <stdio.h>
#include <sys/resource.h>
unsigned myrand() {
static unsigned x = 1;
return (x = x * 1664525 + 1013904223);
}
void increase_stack( rlim_t stack_size )
{
rlim_t MIN_STACK = 1024 * 1024;
stack_size += MIN_STACK;
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0)
{
if (rl.rlim_cur < stack_size)
{
rl.rlim_cur = stack_size;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0)
{
fprintf(stderr, "setrlimit returned result = %d\n", result);
}
}
}
}
void my_func() {
double U[100][2048][2048];
int i,j,k;
for(i=0;i<100;++i)
for(j=0;j<2048;++j)
for(k=0;k<2048;++k)
U[i][j][k] = myrand();
double sum = 0;
int n;
for(n=0;n<1000;++n)
sum += U[myrand()%100][myrand()%2048][myrand()%2048];
printf("sum=%g\n",sum);
}
int main() {
increase_stack( sizeof(double) * 100 * 2048 * 2048 );
my_func();
return 0;
}