Почему размер массива ограничен при объявлении во время компиляции?

Например я могу сделать

int *arr;
arr = (int *)malloc(sizeof(int) * 1048575);

но я не могу сделать это без сбоя программы:

int arr[1048575];

почему это так?

3 ответа

Решение

Если предположить, arr является локальной переменной, объявляющей ее как массив, использующий память из (относительно ограниченного) стека, в то время как malloc() использует память из (относительно безграничной) кучи.

Если вы размещаете их как локальные переменные в функциях (это единственное место, где вы можете сразу же получить объявление указателя с последующим malloc звоните), тогда разница в том, что malloc выделит кусок памяти из кучи и даст вам ее адрес, при этом непосредственно int arr[1048575]; попытается выделить память в стеке. Стек имеет гораздо меньше доступного места.

Размер стека ограничен по двум основным причинам, о которых я знаю:

  1. Традиционное императивное программирование очень редко использует рекурсию, поэтому глубокая рекурсия (и большой рост стека) является "вероятно" признаком бесконечной рекурсии, и, следовательно, ошибкой, которая убьет процесс. Поэтому лучше, если он будет перехвачен до того, как процесс использует гигабайты виртуальной памяти (в 32-битной архитектуре), что приведет к исчерпанию адресного пространства процесса (в этот момент машина, вероятно, использует гораздо больше виртуальной памяти, чем фактически имеет). RAM, и, следовательно, работает очень медленно).
  2. Многопоточные программы требуют нескольких стеков. Следовательно, системе времени выполнения необходимо знать, что стек никогда не выйдет за определенную границу, поэтому он может поместить другой стек после этой границы, если будет создан новый поток.

Когда вы объявляете массив, вы помещаете его в стек.

Когда вы вызываете malloc(), память берется из кучи.

Стек обычно более ограничен по сравнению с кучей и обычно является временным (но это зависит от того, как часто вы входите и выходите из функции, в которой объявлен этот массив).

Для такой большой (может быть, не по сегодняшним меркам?) Памяти рекомендуется размещать ее неправильно, предполагая, что вы хотите, чтобы массив работал в течение некоторого времени.

Другие вопросы по тегам