I wonder if stack size can grow like heap does during runtime?
The amount of stack used certainly increases, as you allocate local variables and make function calls. Whether the stack's maximum size can grow is technically undefined, but in practice is generally constant. You can make the constant bigger with a flag to the OS, but usually each thread gets a certain size of stack. When you use too much, it's a stack overflow.