2011-06-16 70 views
2

我想尝试一个更复杂的例子,在对象中分配新的内存和进一步内部分配,但需要知道确切的时间一个计算器会发生。所以决定尝试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的

+2

优化器可能会从计划中删除它。 (并且main应该返回一个int) – MByD 2011-06-16 09:02:56

+5

@MByD:'main'中的'return'语句是可选的(标准允许的例外情况)。 – ybungalobill 2011-06-16 09:03:52

+3

访问数组中的某些元素(即第一个和最后一个)并查看是否触发了您期望的错误。一般来说,如果你不访问内存,创建一个在栈中没有构造函数的变量作为指针的偏移量(堆栈指针),那么就没有问题了。此外,如果编译器可以检测到数组未被使用,那么它可以完全删除这些变量,并将函数碰撞到void void(){}' – 2011-06-16 09:03:58

回答

5

制作富调用本身递归,并与每个调用一些反增。你会很快得到你的错。

+1

是的,它给了一个分段错误好,但真正的问题是关于为什么它没有发生递归没有发生。我想优化是罪魁祸首。 – Nav 2011-06-16 09:12:17

1

尝试,如果你有什么在foo的功能不感兴趣优化编译-o0

+0

没有。没有优化编译没有帮助。 – Nav 2011-06-16 09:16:17