2012-02-23 2 views
1

Я пытаюсь сейчас объявить массив больших символов. Я использую массив символов как растровое изображение (как на карте булевых, не тип файла изображения). Следующий код генерирует ошибку компиляции.Объявление массива больших символов в C++

//This is code before main. I want these as globals. 
unsigned const long bitmap_size = (ULONG_MAX/(sizeof(char))); 
char bitmap[bitmap_size]; 

Ошибка переполнения в размерности массива. Я понимаю, что я пытаюсь, чтобы мой процесс потреблял много данных и что может быть какой-то предел, который мешает мне это делать. Мне интересно, я делаю синтаксическую ошибку или мне нужно запрашивать больше ресурсов из ядра. Кроме того, я не заинтересован в создании растрового изображения с некоторым классом. Спасибо за ваше время.

EDIT ULONG_MAX очень сильно зависит от используемой вами машины. На конкретной машине я составлял свой код, на нем было более 4,2 миллиарда. В общем, я бы не стал использовать эту константу как константу, по крайней мере, для выделения памяти.

+2

Just FYI, 'sizeof (char)' всегда 1, поэтому разделение бессмысленно. –

+4

вы знаете, что вы пытаетесь выделить 4 гигабайта памяти на 32-битной машине? – fazo

+0

последовательные 4 гигабайта памяти – triclosan

ответ

4

ULONG_MAX/sizeof(char) - это то же самое, что и ULONG_MAX, что очень много. На самом деле такой большой, что у вас нет места для него даже в виртуальной памяти (потому что ULONG_MAX - это, вероятно, количество байтов во всей виртуальной памяти).

Вам определенно нужно переосмыслить то, что вы пытаетесь сделать.

+0

Спасибо. Я имел в виду разделить ULONG_MAX на количество бит в символе, а не на количество байтов. После этого компилятор больше не жаловался. – order

0

Как я понимаю, максимальный размер массива в C++ - это наибольшее целое число, поддерживаемое платформой. Вероятно, ваша константа bitmap_size длинного типа превышает этот предел.

4

Невозможно объявить массив, который большой для большинства систем - в 32-разрядной системе, этот массив - 4 ГБ, который не вписывается в доступное адресное пространство и на большинстве 64-битных систем, это 16 экзабайт (16 миллионов терабайт), которые не вписываются в доступное адресное пространство там (и, кстати, может быть больше памяти, чем существует на всей планете).

Используйте malloc() для выделения больших объемов памяти. Но будьте реалистами. :)

Смежные вопросы