Определение большого массива размера, превышающего предел без знака int - PullRequest
3 голосов
/ 16 июня 2009

Мне нужно определить массив статически (в * .h) файле размером 12884901888, как.

unsigned char sram[12884901888]; //All of my code is C.

Выше декларация выдает ошибку и не работает.

Поскольку константы, используемые в объявлениях массива, являются беззнаковыми целыми. Но константа, которую мне нужно использовать (12884901888), больше, чем предел без знака int.

Как я могу определить массив, как указано выше, размером 12884901888?

Спасибо.

-AD

P.S. Я знаю, что многие скажут: оптимизируйте этот огромный размер массива, но мне нужно использовать его по какой-то причине, специфичной для моего случая.

Ответы [ 3 ]

2 голосов
/ 16 июня 2009

Это для встроенного микроконтроллера? Часто вы можете получить что-то вроде:

#define sram (*((unsigned char (*)[1]) 0))

Если ваш компилятор не реализует проверку границ, размер массива не имеет значения. В любом случае вы не хотите, чтобы компилятор пытался зарезервировать 12884901888 байт, потому что связывание не удастся.

2 голосов
/ 16 июня 2009

Сделать размер массива длинным без знака.

unsigned char sram[12884901888ULL];
0 голосов
/ 02 марта 2016

Преобразование 12884901888 в шестнадцатеричное дает: 0x3-0000-0000 (Я разделил каждую группу по 16 битов)

Другими словами, этому массиву неподписанных байтов нужно 3 раза по 4 гигабайта. Предполагается, что компилятор сгенерирует адресный указатель на 34 бита, чтобы это работало

Я согласен с finnw, вам не нужно указывать компилятору размер массива. Если вы укажете размер, вы получите большой OBJ-файл для модуля и аналогично большой ELF / EXE для конечного исполняемого файла.

...