我想尝试一个更复杂的例子,在对象中分配新的内存和进一步内部分配,但需要知道确切的时间一个计算器会发生。所以决定尝试this的例子。我从main()
调用foo()
函数,并期望它给出一个stackoverflow错误。它没有。在foo中,我将数组大小增加了几个零,并在foo中增加了40个这样的数组声明。仍然没有崩溃。
我使用的是gcc版本4.4.2 20091027(Red Hat 4.4.2-7)(GCC)。不应该大约1MB以上的堆栈分配给出一个stackoverflow错误?Stackoverflow没有发生,试图找出是否分配堆栈或堆内存
void foo()
{
double x[100000000];
double x1[100000000];
double x2[100000000];
double x3[100000000];
double x4[100000000];
//...and many more
}
int main()
{
foo();
}
编译为GCC -o测试test.c的
优化器可能会从计划中删除它。 (并且main应该返回一个int) – MByD 2011-06-16 09:02:56
@MByD:'main'中的'return'语句是可选的(标准允许的例外情况)。 – ybungalobill 2011-06-16 09:03:52
访问数组中的某些元素(即第一个和最后一个)并查看是否触发了您期望的错误。一般来说,如果你不访问内存,创建一个在栈中没有构造函数的变量作为指针的偏移量(堆栈指针),那么就没有问题了。此外,如果编译器可以检测到数组未被使用,那么它可以完全删除这些变量,并将函数碰撞到void void(){}' – 2011-06-16 09:03:58