2012-01-29 26 views
4

在解决与DP相关的问题时,我观察到第一个工作正常但第二个seg错误。 什么是实际的原因,什么是仅使用int的内存限制?拥有较大的二维数组:static int vs int

int main(){ 
    static int a[3160][3160]; 
    return 0; 
} 

int main(){ 
    int a[3160][3160]; 
    return 0; 
} 
+0

[数组大小限制](http://stackoverflow.com/questions/9016538/array-size-limits) – 2012-01-29 10:23:13

回答

5

因为您可能没有足够的堆栈内存来存储该大阵列。

第二个示例在堆栈上创建一个数组,而第一个示例创建一个数组,该数组不在堆栈中,而是在数据/ Bss段中的某处,因为您使用static限定符明确指定存储条件。

请注意,C++标准没有指定stackheapdata segmentBss segment这些都是实现定义的细节。标准只规定了用不同存储标准声明的变量的期望行为。所以,其中变量实际上是创建是实现定义,但有一点可以肯定的是,因为没有足够的内存在该地区的两个例子将创建不同的存储区域阵列和第二个崩溃。

此外,可能如果你是在实际执行创造如此巨大的尺寸的阵列设计似乎有瑕疵,你可能要考虑重新审视它。

您可能还需要考虑使用std::arraystd::vector,而不是传统的C风格的数组。

+0

可能的重复“示例将在不同的内存区域中创建数组”我认为发生了什么 - Short和很好,如果没有其他答案,我会标记这一个:) – 2012-01-29 09:37:09

1

堆栈分配是大是不安全的(除非你要履行担保)。

堆栈大小因平台/硬件而异。因此,“记忆限制”变化很大。如果您使用这样的巨大堆栈数组,则当您的程序在您用于开发的处理器以外的其他处理器上运行时,经常会发现此错误。如果你需要绝对需要一个很大的堆栈,你必须用显式的堆栈大小创建你自己的线程。

但是,是不是需要的措施,因为你应该使用动态分配在这里。

static是不是一个很好的选择,如果你需要它是折返。

至于阿尔斯指出的(+1) - 用于运行时错误的原因很可能堆栈大小。