Когда вы объявляете массив, вы помещаете его в стек.
Когда вы вызываете malloc (), память берется из кучи.
Стек обычно более ограниченпо сравнению с кучей, и обычно является временным (но это зависит от того, как часто вы входите и выходите из функции, в которой объявлен этот массив.
Для такой большой (может быть, не по сегодняшним меркам?) памяти этоХорошей практикой является его неправильное размещение, при условии, что вы хотите, чтобы массив работал в течение некоторого времени.