Задать вопрос
@makaleks

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

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

Но:

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


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


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

    Спасибо!

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

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

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

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

Похожие вопросы