почему размер массива ограничен при объявлении во время компиляции? - PullRequest
8 голосов
/ 29 июня 2011

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

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

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

int arr[1048575];

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

Ответы [ 3 ]

11 голосов
/ 29 июня 2011

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

2 голосов
/ 29 июня 2011

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

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

  1. Традиционное императивное программирование очень мало используетрекурсия, такая глубокая рекурсия (и большой рост стека) является «вероятно» признаком бесконечной рекурсии, и, следовательно, ошибкой, которая убьет процесс.Поэтому лучше, если его поймают за до , процесс потребляет гигабайты виртуальной памяти (в 32-битной архитектуре), что приведет к исчерпанию адресного пространства процесса (в этот момент машина, вероятно, использует гораздо больше).виртуальной памяти, чем она на самом деле имеет ОЗУ, и, следовательно, работает очень медленно).
  2. Многопоточным программам требуется несколько стеков.Следовательно, системе времени выполнения необходимо знать, что стек никогда не выйдет за пределы определенной границы, поэтому он может поместить другой стек после этой границы, если создается новый поток.
1 голос
/ 29 июня 2011

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

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

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

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

...