First of all, the C standard doesn't impose any requirements on how the stack/heap is implemented by
the platform.
What is the initial size with which a stack/heap is created? and who decides it?
Typically a fixed size of stack is allocated for every process by the OS which is platform-specific.
There's no limit on heap size, program usually have all of the available virtual address space.
Wherein physical memory are they are created?
This is platform specific. Typically stack grows downwards and heap grows upwards.