To answer your question 1, the short answer is yes. The long answer is when an executable is linked, there are also fields in the executable header (For Unix and Unix-Like operating systems, it's ELF. Windows uses PE32/64 for 32-bit and 64-bit.) that determine the initial size of the static data area, the stack, and the heap.
For your question 2, the short answer is "it depends." Since most modern operating systems today use virtual memory, it is common to use Virtual Memory Addressing where each program is given its own separate memory space. The size of this memory space is either 2^32 on 32-bit systems or 2^64 on 64-bit systems. A good discussion on the layout of a running program on Linux can be found here. A request to the operating system will map in more pages to extend the range of valid addresses for the program to use. These new ranges are backed by physical RAM until they are swapped out to disk.
With that being said, there are program types that are fixed in size. For example, from the old MS-DOS era, there is something known as a .COM (COre iMage) file which is an executable, but it is allocated a fixed 64k-bytes. Although, with the nature of the machines back in the day, a COM file could access the entire memory map of the machine without consequence. Other machine types have different versions of this. Current Unix implementations however, supports the ELF executable type, and possibly others such as a.out. Executable script files which are equivalent to .BAT and .CMD files on Windows, use an interpreter which is an ELF binary.