DIJ
V2EX  ›  问与答

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

  •  
  •   DIJ · Jul 12, 2015 · 3939 views
    This topic created in 3950 days ago, the information mentioned may be changed or developed.
    Mac OS X Yosemite 下,用 clang 编译。

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

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

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

    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  
       Jul 12, 2015
    妈蛋 回复不能用markdown吗
    lirau
        8
    lirau  
       Jul 12, 2015
    简单来讲 内存分配分为堆栈两种 你可能是局部产量超过栈的大小了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2921 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 07:14 · PVG 15:14 · LAX 00:14 · JFK 03:14
    ♥ Do have faith in what you're doing.