V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
DIJ
V2EX  ›  问与答

C++ 程序数组开的稍大 (2000 * 2000) 就报 Segmentation fault: 11

  •  
  •   DIJ · 2015-07-12 11:17:39 +08:00 · 3273 次点击
    这是一个创建于 3454 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Mac OS X Yosemite 下,用 clang 编译。

    @segmentfault XD
    8 条回复    2015-07-12 14:14:48 +08:00
    znoodl
        2
    znoodl  
       2015-07-12 11:27:32 +08:00
    这么大居然不用new/malloc
    DIJ
        3
    DIJ  
    OP
       2015-07-12 11:29:05 +08:00
    @hahastudio
    其实刚才找到了,但是本来就是开在函数外部的数组,加了 static 的效果是本来在输入数据前报错,现在在输入之后报错......

    vector 竞赛貌似并不能用......以前在 Windows / Linux 下完全没有这种问题......
    kzzhr
        4
    kzzhr  
       2015-07-12 11:59:58 +08:00
    函数体内的数组会放在栈中,一般会爆。
    可以强制改一下,(竞赛允许改这个。至于vector还是算了,会慢哭你的)
    #pragma comment(linker, "/STACK:1024000000,1024000000")

    不过还是推荐使用malloc/calloc把数组放在堆上或者开全局
    yksoft1
        5
    yksoft1  
       2015-07-12 13:20:44 +08:00
    记得ACM学习里面有专门提到如何有效实现大内存分配
    aheadlead
        6
    aheadlead  
       2015-07-12 13:56:09 +08:00
    你或许是定义在某个函数里面吧

    int main() {
    int arr[2000][2000]; // segmentation fault here
    return 0;
    }

    一个 int 变量占用 8 字节空间
    2000 * 2000 * 8 = 32000000B = 30.517578125MB

    你用 ulimit -s 看看栈大小,应该是比 30 要小。

    Workaround

    int arr[2000][2000];
    int main() {
    return 0;
    }

    全局变量存在于静态区,这样就没有爆栈的问题了。
    aheadlead
        7
    aheadlead  
       2015-07-12 13:56:25 +08:00
    妈蛋 回复不能用markdown吗
    lirau
        8
    lirau  
       2015-07-12 14:14:48 +08:00
    简单来讲 内存分配分为堆栈两种 你可能是局部产量超过栈的大小了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2978 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:33 · PVG 08:33 · LAX 16:33 · JFK 19:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.