2009-12-12 72 views
3

我有一个程序需要在C中声明一个大小为1000000的大整数数组(使用GNU GCC编译器)。我试图用两种不同的方式声明数组。主函数内部大量内存的静态分配

两种可能的代码是:

#include <stdio.h> 
int arr[1000000]; 
int main() 
{ 
    return 0; 
} 

#include <stdio.h> 
int main() 
{ 
    int arr[1000000]; 
    return 0; 
} 

后者版本运行期间挂起。可能的原因是什么?

非常感谢!

回答

9

第二个版本在堆栈上分配,对于任何给定的进程,其大小可能会限制在您的系统上。第一个分配给进程的数据段,其大小不受限制(至少对于这些数量级的分配大小)

this SO answer您可以了解如何检查堆栈分配限制各种平台,如Linux和Windows。

ulimit -a 
+0

如果需要,您通常可以将堆栈大小上移到gcc编译器选项。你应该可以让gcc在编译过程中标记堆栈溢出。 – Paul 2009-12-12 06:18:51

+0

@Paul当然,由于单独编译,大多数堆栈溢出只能在链接时标记出来? – 2009-12-12 11:22:50

+0

@Pascal:只有一些...递归使其不确定 - 你永远不知道运行时有多深 – 2009-12-12 13:39:11

1

既然你用这个词静态的称号,这是一个奇迹,它没有发生实际声明变量static:如果你是在Linux上,因为它是那么简单。

int main() 
{ 
    static int arr[1000000]; 
    return 0; 
} 

您也可以使用动态分配。

+0

不知道为什么它被downvoted。我把它撞回去了。 – 2009-12-12 23:49:05