Reputation: 229311
I get a segfault from this line of code:
int fatblob[1820][286][5];
Why is that?
Upvotes: 3
Views: 680
Reputation: 2612
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.
Upvotes: 3
Reputation: 84149
Because your stack segment is smaller then 1820*285*5
int
s. It's usually in a neighborhood of 1MB.
Upvotes: 8
Reputation: 15877
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.
Upvotes: 1
Reputation: 19204
Because stack overflows. Try to allocate that array on the heap.
Upvotes: 3
Reputation: 41378
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.
Upvotes: 7