Первая ошибка: size_t
не обязательно unsigned int
, поэтому его максимальное значение может отличаться от значения unsigned int
(UINT_MAX
);более того, в C ++ для получения информации об ограничениях типа вы должны использовать std::numeric_limits
.
#include <limits>
size_t s=std::numeric_limits<size_t>::max();
Вторая ошибка: массив никогда не будет таким большим;поскольку size_t
требуется, чтобы иметь возможность выразить самый большой размер любого объекта, он, вероятно, должен быть достаточно большим, чтобы выразить объект, большой как все адресное пространство, доступное для приложения, но попытка выделить такой большой объект потребовала бы выделения целое адресное пространство для него, что недопустимо;более того, вы запрашиваете массив размером int
s, что означает, что он будет иметь размер UINT_MAX*sizeof(int)
байт, что, вероятно, будет примерно в 4 раза больше всего адресного пространства - явно бессмысленным - и, кстати, sizeof(arr)
не смог бы выразить размер такого объекта, и вообще указатели не могли бы даже достичь вершины этого массива.Компилятор обнаруживает эти ошибки и мешает вам сделать это.
Более того, я делаю вывод, что вы пытаетесь выделить эту вещь в стеке, которая обычно намного меньше, чем вся память, которую может использовать приложение.и вообще нецелесообразно размещать там большие массивы (для этого следует использовать кучу).
Третья ошибка: выделять всю эту память не имеет смысла.Если у вас большие требования к памяти, вы должны размещать содержимое в куче, а не в стеке, и выделять только ту память, которая вам нужна, чтобы хорошо играть вместе с ОС и другими приложениями (это последнее соображение неприменимо, если вы работаетево встроенных системах, где вы - единственное приложение, которое работает).
Второй фрагмент кода в C ++ даже не должен работать, поскольку, если эта вещь размещена в стеке, вы собираетесь работать нестандартно, поскольку онабудет VLA (доступно в C99, но категорически отвергается из текущего и следующего стандарта C ++).Однако в этом случае код для выделения этого массива используется во время выполнения (VLA в общем случае не являются фиксированными в измерениях), поэтому проверка компилятора не очевидна (хотя я предполагаю, что эта вещь может быть легко обнаруженаоптимизатор, который, если семантика VLA не отличается от обычных массивов, может оптимизировать VLA и попытаться создать обычный массив =>, который не будет работать по тем же причинам, о которых я говорил).
Короче говоря: этонет смысла выделять всю эту память (которую вы даже не могли бы адресовать), особенно в стеке.Используйте кучу и выделите именно то, что вам нужно.Если у вас есть особые требования, вам следует изучить специальные функции виртуальной памяти, предоставляемые вашей ОС.