在解决与DP相关的问题时,我观察到第一个工作但第二个seg故障。 什么是实际原因以及使用int的内存限制是多少?
int main(){
static int a[3160][3160];
return 0;
}
int main(){
int a[3160][3160];
return 0;
}
答案 0 :(得分:5)
因为你可能没有足够的堆栈内存来存储那个大数组。
第二个示例在堆栈上创建一个数组,而第一个示例创建一个不在堆栈上但在data / Bss段中某处的数组,因为您使用static
限定符明确指定了存储条件。
请注意,c ++标准未指定stack
或heap
或data segment
或Bss segment
这些都是实现定义的详细信息。该标准仅指定使用不同存储条件声明的变量的预期行为。所以,其中变量实际上是创建的是实现定义但有一点可以肯定的是,你的例子都会在不同的内存区域创建数组,第二个会崩溃,因为那里该地区的记忆力不足。
此外,如果您在实际实施中创建如此巨大尺寸的数组,您的设计似乎存在缺陷,您可能需要考虑重新访问它。
您可能还想考虑使用 std::array 或 std::vector ,而不是传统的c风格数组。
答案 1 :(得分:1)
大的堆栈分配是不安全的(除非你要履行该保证)。
堆栈大小因平台/硬件而异。因此,“内存限制”变化很大。如果您使用这样的大型堆栈数组,那么当您的程序在用于开发的处理器之外的处理器上运行时,请准备好经常看到此错误。如果绝对需要一个大的堆栈,则必须使用显式堆栈大小创建自己的线程。
但是,不需要该度量,因为您应该在此处使用动态分配。
static
如果您需要它是可重入的,则不是一个好的选择。
正如Als所指出的那样(+1) - 运行时错误的原因很可能就是堆栈大小。