Ошибка компиляции: невозможно выделить массив постоянного размера 0. Почему я получаю это? - PullRequest
1 голос
/ 26 мая 2009

Я столкнулся с одной проблемой при работе над кодом C с помощью компилятора Microsoft Visual Studio-2005.

Я пытался статически объявить большой буфер как:

int gbl_data[4096*4096*256]; 

РЕДАКТИРОВАТЬ: Это объявление было глобальной переменной в заголовочном файле.

Он выдавал ошибку компиляции, говоря: « не может выделить массив постоянного размера 0 ».

Означает, что размер 4096X4096X256 каким-то образом становился слишком большим, чем размер MAX_INT_LIMIT (2 ^ 31), и может обернуться и стать -ve или около того. Но тогда он должен был дать ошибку как «отрицательный индекс».

Я попытался привести константы как 4096UL x 4096UL x 256UL, все та же ошибка компиляции.

В чем причина этой ошибки?

Это потому, что физическая память не хватает для размещения этого буфера большого размера или что?

Что это за исправление?

Спасибо.

-GM.

Ответы [ 2 ]

9 голосов
/ 26 мая 2009

Размер массива не является целым, это беззнаковое целое. Максимальное значение без знака int равно 4294967295. У вас есть еще один, и он оборачивается до 0.

Преобразование констант в длинные значения ничего не меняет, поскольку длинные значения также 32-разрядные целые числа на большинстве платформ.

Вместо этого можно попробовать длинные лонги, но теперь мы столкнулись с другой маленькой проблемой.

Вы пытаетесь выделить 4 миллиарда целых чисел. 32-разрядный процессор имеет объем памяти 4 миллиарда байтов . Вы пытаетесь выделить в 4 раза больше теоретического объема памяти, который может существовать. (16GB)

Итак, вернемся к чертежной доске. Выясните, почему вы пытались это сделать, и что вы можете сделать вместо этого.

0 голосов
/ 26 мая 2009

Вы пытаетесь статически выделить массив из 2 ^ 32 (или в 4 раза больше адресного пространства в 32-битной системе). Похоже, что компилятор усекает 4096 *4096* 256 (то есть 0x10000), до 32-битного значения.

В зависимости от вашей платформы, unsigned long также может быть 32-битным, а также усеченным.

Я бы посоветовал вам убедиться, что вы компилируете для 64-битной платформы (если это то, что вы намереваетесь), или измените алгоритм для динамического выделения памяти (очевидно, не больше, чем адресное пространство) или для работы. с файлами на диске.

...