@makaleks

Как создать большой массив в разных инициализациях?

Нужен большой массив типа char
Массив нужен будет постоянно, т. е. динамичное выделение памяти, по сути, абсолютно ни к чему.

Но:

Почему я не могу создать большой массив (статический)
так,
char p[1000000];snimok1.png


но могу преспокойно выделять ту же память динамически
эдак.
char *kuk = new char[1000000];
delete [] kuk;
snimok2.png


Сами вопросы:
  1) Откуда такая разница при разных реализациях?
  2) Возможно ли в моём случае создавать большие статические массивы?
   2.1) Чем ограничен размер массива?

    Спасибо!

зачем оно мне (не очень к теме)
 Всего лишь реализация редактируемой 3D карты средствами OpenGL.

 Конечно, есть небезызвестная карта высот (это где по насыщенности цвета определяешь высоту), но в этом случае нельзя создавать пещеры, тоннели и некоторые углубления, да и редактировать это дело хочется (новые дырки делать).
 С ресурсами приложения (пока) и близко не знаком
  • Вопрос задан
  • 3446 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему я не могу создать большой статический массив

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы