首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段错误:堆栈溢出

分段错误:堆栈溢出
EN

Stack Overflow用户
提问于 2012-05-14 08:16:51
回答 5查看 2.1K关注 0票数 4

linux 2.6.32-220.7.1.el6.x86_64g++ 4.4.6中会发生以下情况。

以下代码:

代码语言:javascript
复制
#include <iostream>
#include <cstdlib>

int PROB_SIZE   = 10000000;
using namespace std;

int main(int argc, char *argv[])    {

    unsigned int numbers[PROB_SIZE];
    cout << "Generating " << PROB_SIZE << " random numbers... " << flush;

    return 0;
}

生成以下SIGSEGV:(gdb)运行启动程序: /home/cpd20202/sorting/error

代码语言:javascript
复制
Program received signal SIGSEGV, Segmentation fault.
0x000000000040093b in main (argc=1, argv=0x7fffffffe4f8) at error.cpp:13
13      cout << "Generating " << PROB_SIZE << " random numbers... " << flush;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6_2.5.x86_64 libgcc-4.4.6-3.el6.x86_64 libstdc++-4.4.6-3.el6.x86_64
(gdb) where
#0  0x000000000040093b in main (argc=1, argv=0x7fffffffe4f8) at error.cpp:13

我真的没主意了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-14 08:18:30

您的"numbers“数组正在堆栈上分配,可能太大了。您将需要动态分配数组。

票数 5
EN

Stack Overflow用户

发布于 2012-05-14 08:18:44

这是因为您的数组大于堆栈的大小。因此,当您的程序试图在函数调用期间推送一些新的东西时,它会崩溃。

你得到的错误在概念上与堆栈溢出是一样的,只是它是由一个非常大的局部变量引起的,而不是嵌套了太多的函数调用。

堆栈是一小块内存区域,供用于内务和局部变量的函数使用。它从来不是很大,最多只有几兆字节。这就是为什么你需要一个动态分配来解决你的问题。大多数动态分配将在堆上进行,堆通常只受物理内存的限制。

您将需要在堆上分配数组。为此,您有几种选择,其中最简单的可能是使用std::vector<int>。它们的行为与普通数组大致相同,并且它们的存储是自动管理的,所以这应该不是问题。

代码语言:javascript
复制
#include <vector>
#include <iostream>

int PROB_SIZE   = 10000000;
using namespace std;

int main()
{
    vector<int> numbers(PROB_SIZE);
    cout << "Generating " << PROB_SIZE << " random numbers... " << flush;

    return 0;
}
票数 8
EN

Stack Overflow用户

发布于 2012-05-14 08:18:47

您的进程没有足够的堆栈空间来分配一千万个整数。这是40兆字节(或者如果你的int是64位的话是80兆字节),进程通常从大约1兆字节的堆栈开始。

您有两个基本选择:

将数组作为全局变量分配(通过使用std::vector.、或

  • 将其声明移到堆上的数组的malloc之外),将数组作为全局变量进行分配
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10576257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档