为什么这段代码会出现运行时分段错误
Why is this code giving runtime segmentation fault?
为什么这段代码会出现分段错误?我正在使用代码::块。
#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::array
或std::vector
,而不是纯 C 数组。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 如何修复分段错误运行时错误
- 多线程中的 std::basicstring 的运行时分段错误C++点燃进程
- C++ 中控制台代码运行时的分段错误
- 为什么这个 c++ 代码在运行时给我分段错误?
- 意外的运行时错误(分段错误)
- c++分段错误:为什么这个程序给出运行时错误(SIGSEGV)
- 通过菜单运行时分段故障
- iarcs WORDLIST运行时分段故障
- 为什么这段代码会出现运行时分段错误
- 运行时出现C++ (DevC++) 分段错误
- 未在调试时运行时的分段
- 我收到分段错误(核心转储)错误,但仅当我的一半代码运行时
- libusb 1.0程序以user身份运行时出现分段错误,而不是sudo身份
- 运行时出现不一致的分段错误
- c++中运行时的分段故障
- C++代码编译,但在运行时出现分段错误。我想我正在篡改链表
- 在运行时加载的共享库中使用动态分配对象时出现分段错误