开发者

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

I get a segfault from this line of code:

int开发者_StackOverflow社区 fatblob[1820][286][5];

Why is that?


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


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.


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


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.


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜