Why do I get a segfault in C from declaring a larg

2019-01-12 11:57发布

问题:

I get a segfault from this line of code:

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

Why is that?

回答1:

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.



回答2:

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



回答3:

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



回答4:

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.



回答5:

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.



标签: c stack