Почему я не могу создать большой статический массив
Потому что в приведённом коде массив не статический, а на стеке.
Статическим он станет, если вы припишете к нему слово static или вынесете его определение из функции.
Почему программа при этом падает -- потому что размера стека недостаточно. Размер резервируемого стека (т.е. максимально возможный размер стека, память под него выделяется по мере использования) записан в свойствах вашего PE файла и может быть установлен во время линковки.
Динамически вы выделяемый массив размещается в куче. На размер кучи тоже есть ограничения, но, как правило, они существенно больше. Кроме того, приложение может создавать новые кучи нужного размера во время выполнения.
Размер массива ограничен следующими вещами:
1. размером указателя (т.е. моделью памяти, под которую производится сборка. Так, например, в модели x32 с 32-битными указателями суммарный размер всех массивов ограничен 4 гигабайтами)
2. типом размещения массива:
- автоматический (на стеке) -- зарезервированным размером стека;
- статический (в сегменте данных/bss) -- размером указателя;
- динамический (в куче) -- зарезервированным размером кучи/реализацией менеджера памяти;
- в памяти выделенной VirtualAlloc/MapViewOfFile/... -- размером указателя и текущей фрагментацией адресного пространства.