为什么这段代码会出现运行时分段错误

Why is this code giving runtime segmentation fault?

本文关键字:运行时 分段 错误 段代码 代码 为什么      更新时间:2023-10-16

为什么这段代码会出现分段错误?我正在使用代码::块。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
     int a[555555];
}
这就是

所谓的stack overflow
通常堆栈大小很小,您无法在堆栈上分配如此大的内存。
为此,程序员将其分配给堆(使用动态分配)。在 C 中,可以使用malloc族函数

int *a = malloc(sizeof(int)*55555); // Use free(a) to deallocate

在C++中,您可以使用new运算符

int *b = new int[555555];   // Use delete [] to deallocate

因为您正在尝试在堆栈上分配超过 2MB(以前我在数学上失败并认为它是 2GB)的内存,然后吹毁堆栈。

注意:对于Windows,特定线程的默认堆栈大小为1MB,在Gnu/linux上,您可以使用ulimit -s命令找出堆栈大小值。

您来

对地方了,可以提出问题。 ;)

阵列很大,位于堆栈上。代码崩溃,因为它用完了有限的堆栈空间。

如果在堆上分配a,问题可能会消失。

正如其他人已经告诉您的那样,您正在尝试在堆栈中分配大量内存,而该堆栈的空间通常非常有限。

例如,请参阅:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
     int a[555555];
     int* b = new int[555555];
     delete [] b;
}

在该截图中,您有两个整数数组,一个在堆中分配,另一个在堆栈中分配。

在这里,您可以找到有关堆和堆栈之间区别的一些解释:

堆栈和堆是什么以及在哪里?http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

我对你的代码有一些考虑。
首先,现代编译器会认识到a未使用,然后它将被丢弃。
但是,如果您将某个值放入某个位置,即使它大于堆栈大小,也会分配a。内核不允许你这样做:这就是你得到一个SIGSEGV的原因。
最后,您应该依赖std::arraystd::vector,而不是纯 C 数组。