Stack is also used to store function's parameters and return address. That's why the stack memory is considered "not-dynamic" - it is just too easy to break the whole program flow if you are doing something tricky to the stack by yourself while app is running.
But, it is STILL possible to dynamically allocate the memory in the stack using inline assembler and esp processor register (it points to the stack).
Consider a basic example:
__int64 *p = 0; //pointer
__asm sub esp,8h //"allocate" 8 bytes in the stack
__asm mov p,esp //store the memory pointer so we can use it in C code
//use our `p' variable dynamically allocated in the stack
__asm add esp,8h //"deallocate" 8 bytes from the stack
"allocate" and "deallocate" terms are quoted because there are no such procedures for the stack, we just subtract and add to the stack pointer.
It may be useful to wrap the assembly code here in some inline functions, like stack_alloc() and stack_free().