我正在浏览一个帖子。
程序崩溃了,因为它在一个函数内部声明了一个大小为10^6的数组。
给出的原因是栈上的内存分配失败导致崩溃。
当同一数组全局声明时,它可以正常工作。(存储于堆上的内存解决了问题)。
现在假设一下,栈向下增长,堆向上增长:
---栈---
-------------------
---堆----
那么,我相信如果在栈上分配内存失败, 在堆上也必定会失败。
所以我的问题是:栈大小有限制吗? (超过限制会导致程序崩溃)。 还是我漏掉了什么?
我正在浏览一个帖子。
程序崩溃了,因为它在一个函数内部声明了一个大小为10^6的数组。
给出的原因是栈上的内存分配失败导致崩溃。
当同一数组全局声明时,它可以正常工作。(存储于堆上的内存解决了问题)。
现在假设一下,栈向下增长,堆向上增长:
那么,我相信如果在栈上分配内存失败, 在堆上也必定会失败。
所以我的问题是:栈大小有限制吗? (超过限制会导致程序崩溃)。 还是我漏掉了什么?
是的,栈总是有限制的。在多种语言/编译器中,您可以设置所需的大小。
通常情况下,默认值(如果没有手动设置)约为1MB对于当前的语言,这足以满足要求,除非您做一些通常不建议的事情(例如在堆栈上分配大型数组)。
main
。#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>
void grow(unsigned cur_size)
{
if(cur_size * sizeof(int) < 10ul*1024ul*1024ul*1024ul) {
unsigned v[1000];
v[0] = cur_size;
for(unsigned i = 1; i < 1000; ++i) {
v[i] = v[i-1] + 1;
}
grow(cur_size + 1000);
for(unsigned i = 0; i < 1000; ++i) {
if(v[i] != cur_size + i)
puts("Error!");
}
} else {
putchar('#');
getchar();
}
}
int main()
{
struct rlimit l;
l.rlim_max = RLIM_INFINITY;
l.rlim_cur = RLIM_INFINITY;
setrlimit(RLIMIT_STACK, &l);
grow(0);
putchar('#');
getchar();
}
这完全取决于你所使用的语言和编译器。但是,例如使用 C 或 C++ 编译的程序在启动时会分配固定大小的堆栈。堆栈的大小通常可以在编译时指定(在我的特定编译器上,默认为 1 MB)。
您没有提到使用的编程语言,但在Delphi中,编译选项包括最大和最小堆栈大小,我相信所有编译语言都存在类似的参数。
我自己有时候必须增加最大堆栈大小。