tags:

views:

161

answers:

5

I get a segfault from this line of code:

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

Why is that?

+6  A: 

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.

JSBangs
@danben, thanks. I didn't even notice the type--fixed now.
JSBangs
+7  A: 

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

Nikolai N Fetissov
* sizeof(int), over 9MB on a sane, 32-bit system.
Dan Olson
Yep, thanks Dan.
Nikolai N Fetissov
+2  A: 

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

el.pescado
+1 for reference to stack overflows on stack overflow.
Josh
+1  A: 

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.

Yann Vernier
+2  A: 
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.

Kumar Alok