int main(int argc, char const *argv[])
{
int j;
int a[100000000];
for (j = 0; j < 100000000; ++j)
{
a[j] = j;
}
return 0;
}
运行结果:
Segmentation fault (core dumped)
编译时没有错误,这里错误是因为数组太大,导致栈空间不够吗?那一个程序允许的最大栈是多少呢
int main(int argc, char const *argv[])
{
int j;
int a[100000000];
for (j = 0; j < 100000000; ++j)
{
a[j] = j;
}
return 0;
}
运行结果:
Segmentation fault (core dumped)
编译时没有错误,这里错误是因为数组太大,导致栈空间不够吗?那一个程序允许的最大栈是多少呢
这个问题101了。这么大的数组炸栈是肯定的。
栈内存一般而言由系统的约束和配置决定,一般来说默认的在1-8M每进程不等。linux和macosx一般可以用ulimit命令调节,但一般仍会受到操作系统的“硬限制”而不能想调多大调多大。
关于系统栈:
关于栈内存:
事实上这里用全局变量也不是唯一的选择(至少全局变量在语义上还是不太好看)。也可以使用malloc()来做,获取按需分配内存的灵活性,不必事前规定一个“足够大的范围”:
int n, i;
int *a, *p;
scanf("%d", &n);
a = malloc(sizeof(int) * n);
p = a;
for (i=0; i<n; i++)
{
scanf("%d", p++);
}
题外话——“局部变量所在的栈内存区域自然销毁”这件事,坑死多少C程序员。这里不详细展开,但请一定小心不要撞这个常识性的错误,即:不要把任何局部变量的地址用return返回给调用者。
1 回答823 阅读
565 阅读
肯定是栈空间不足,题主这个也太大了。。可以试试放到全局变量。
参考http://www.slyar.com/blog/variable-overflow-static.html