12

I was going through one of the threads. A program crashed because it had declared an array of 10^6 locally inside a function.

Reason being given was memory allocation failure on stack leads to crash.

when same array was declared globally, it worked well.(memory on heap saved it).

Now for the moment, let us suppose, stack grows downward and heap upwards.

We have:

---STACK---

-------------------

---HEAP----

Now , I believe that if there is failure in allocation on stack, it must fail on heap too.

So my question is: is there any limit on stack size? (crossing the limit caused the program to crash). Or am I missing something?

trincot
  • 317,000
  • 35
  • 244
  • 286
Vikas
  • 1,422
  • 2
  • 12
  • 16
  • 1
    There is bit of a myth involved here. You might want to check [this](http://stackoverflow.com/a/12688734/465053) answer. – RBT Feb 06 '17 at 00:53

6 Answers6

8

Yes, stack is always limited. In several languages/compilers you can set the requested size.

Usually default values (if not set manually) are about 1MB for current languages, which is enough unless you do something that usually isn't recommended (like you allocating huge arrays on the stack)

Foxfire
  • 5,675
  • 21
  • 29
6

Contrary to all answers so far, on Linux with GCC (and I guess it is true for all modern POSIX operating systems), maximum stack size is a safety limit enforced by the operating system, that can be easily lifted.

I crafted a small program that calls recursively a function until at least 10 GB is allocated on stack, waits for input on the terminal, and then safely returns from all recursive calls up to main.

#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>

void grow(unsigned cur_size)
{
    if(cur_size * sizeof(int) < 10ul*1024ul*1024ul*1024ul) {
        unsigned v[1000];
        v[0] = cur_size;
        for(unsigned i = 1; i < 1000; ++i) {
            v[i] = v[i-1] + 1;
        }

        grow(cur_size + 1000);

        for(unsigned i = 0; i < 1000; ++i) {
            if(v[i] != cur_size + i)
                puts("Error!");
        }
    } else {
        putchar('#');
        getchar();
    }
}

int main()
{
    struct rlimit l;
    l.rlim_max = RLIM_INFINITY;
    l.rlim_cur = RLIM_INFINITY;
    setrlimit(RLIMIT_STACK, &l);

    grow(0);
    putchar('#');
    getchar();
}
lvella
  • 12,754
  • 11
  • 54
  • 106
5

This all depends on what language and compiler you use. But programs compiled with for instance C or C++ allocate a fixed size stack at program startup. The size of the stack can usually be specified at compile time (on my particular compiler it default to 1 MB).

Andreas Brinck
  • 51,293
  • 14
  • 84
  • 114
  • 1
    I am using C/C++. Compiler is gcc.Windows Platform. Also I get no run-time error doing same on linux platform. I can comfortably declare an array of size 10^6 locally. So What about platform? – Vikas May 06 '10 at 10:10
  • 1
    I wanna create a float 2d array of [400][3000] size .... using gcc on linux but due to lack of memory unable ! any suggestion ???? – dom Oct 25 '15 at 05:58
2

You don't mention which programming language, but in Delphi the compile options include maximum and minimum stack size, and I believe similar parameters will exist for all compiled languages.

I've certainly had to increase the maximum myself occasionally.

Cruachan
  • 15,733
  • 5
  • 59
  • 112
1

Yes, there is a limit on stack size in most languages. For example, in C/C++, if you have an improperly written recursive function (e.g. incorrect base case), you will overflow the stack. This is because, ignoring tail recursion, each call to a function creates a new stack frame that takes up space on the stack. Do this enough, and you will run out of space.

Running this C program on Windows (VS2008)...

void main()
{
    main();
}

...results in a stack overflow:

Unhandled exception at 0x004113a9 in Stack.exe: 0xC00000FD: Stack overflow.

Chris Schmich
  • 29,128
  • 5
  • 77
  • 94
  • yeah certainly It will give run-time error. But my doubt was: If the array declaration locally(on stack) caused runtime error. Why it escaped globally. means we have heap size limit greater than stack size.may be by default!! – Vikas May 06 '10 at 10:13
  • 2
    The first error i get is **Return type is not _int_** so better get rid of non standard code first. – Haseeb Mir Nov 27 '18 at 18:53
1

Maybe not a really good answer, but gives you a little more in depth look on how windows in general manages the memory: Pushing the Limits of Windows

Oliver
  • 43,366
  • 8
  • 94
  • 151