Не существует фиксированного ограничения на размер массива в C.
Размер любого отдельного объекта, включая любой объект массива, ограничен SIZE_MAX
,максимальное значение типа size_t
, являющееся результатом оператора sizeof
.(Не совсем ясно, разрешает ли стандарт C объекты размером более SIZE_MAX
байт, но на практике такие объекты не поддерживаются; см. Сноску.) Поскольку SIZE_MAX
определяется реализацией и не может быть изменен какой-либо программой, этонакладывает верхнюю границу SIZE_MAX
байтов для любого отдельного объекта.(Это верхняя граница, а не в последнюю очередь верхняя граница; реализации могут и обычно накладывают меньшие ограничения.)
Ширина типа void*
, тип общего указателя, накладывает верхнюю границу наобщий размер всех объектов в исполняемой программе (который может быть больше, чем максимальный размер отдельного объекта).
Стандарт C устанавливает для этих фиксированных размеров нижние, но не верхние границы.Никакая соответствующая реализация C не может поддерживать объекты бесконечного размера, но в принципе она может поддерживать объекты любого конечного размера.Верхние границы устанавливаются отдельными реализациями C, средами, в которых они работают, и физикой, а не языком.
Например, соответствующая реализация может иметь SIZE_MAX
, равный 2 1024 -1, что означает, что он может в принципе есть объекты до 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137215 байт.
1025 * Удачи в поиске оборудования, которое на самом деле поддерживает такие объекты. 1027 *
Сноска : Нет явного правила, согласно которому ни один объект не может быть больше
SIZE_MAX
байтов.Вы не могли бы с пользой применить оператор
sizeof
к такому объекту, но, как и любой другой оператор,
sizeof
может переполниться;это не значит, что вы не можете выполнять операции с таким объектом.Но на практике любая нормальная реализация сделает
size_t
достаточно большим, чтобы представить размер любого объекта, который она поддерживает.