Why do I get a segfault in C from declaring a large array on the stack?

前端 未结 5 557
野趣味
野趣味 2020-11-27 08:59

I get a segfault from this line of code:

int fatblob[1820][286][5];

Why is that?

相关标签:
5条回答
  • 2020-11-27 09:01
    int fatblob[1820][286][5];
    

    you are trying to allocate a memory location of 180*286*5*4 (let size of int = 4) that is around 9.8 MB, so there is a possibility of having lesser default stack size on your OS.

    LINUX has 8192 KB(i.e. 8 MB) of stack size. So obviously you will be getting a stack overflow if you are trying to allocate more memory on stack.

    You can try changing the stack size of your OS. In LINUX you can try ulimit

    ulimit -s < whateversize you want it to be>

    like

    $ ulimit -s 1024

    I hope it will help you.

    0 讨论(0)
  • 2020-11-27 09:08

    Because stack overflows. Try to allocate that array on the heap.

    0 讨论(0)
  • 2020-11-27 09:13

    Automatic variables (the default type) in C are usually allocated on the stack. The stack is a memory region allocated per thread, and while it may grow on many operating systems, it always has a limited size. danben's answer covers the default stack pretty well, but if you're using threads, you're allocating new ones in thread creation (e.g. pthread_attr_setstacksize). In general, large allocations are better done on the heap (malloc/new), but even that may be too small sometimes. mmap() or similar sometimes help then.

    Where did danben's answer go? It linked to some information on stack limits.

    0 讨论(0)
  • 2020-11-27 09:15

    You're trying to allocate 1820 * 285 * 5 * sizeof(int) bytes = about 10MB (if sizeof(int) == 4). That's probably more bytes than your OS gives you for stack allocation by default, so you get a stack overflow/segfault.

    You can fix this by either asking for extra stack when you create the thread, allocating on the heap, or changing the OS defaults.

    0 讨论(0)
  • 2020-11-27 09:27

    Because your stack segment is smaller then 1820*285*5 ints. It's usually in a neighborhood of 1MB.

    0 讨论(0)
提交回复
热议问题