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