Максимальный размер массива в C

Я понимаю, что аппаратное обеспечение ограничит объем памяти, выделенный во время выполнения программы. Тем не менее, мой вопрос без учета аппаратного обеспечения. Предполагая, что не было предела для объема памяти, не было бы предела для массива?

Ответ 1

Не существует фиксированного предела размера массива в C.

Размер любого отдельного объекта, включая любой объект массива, ограничен SIZE_MAX, максимальным значением типа size_t, который является результатом оператора sizeof. (Не совсем ясно, разрешает ли стандарт C объекты больше, чем SIZE_MAX байты, но на практике такие объекты не поддерживаются, см. Сноску.) Поскольку SIZE_MAX определяется реализацией и не может быть изменена какой-либо программой, это налагает верхнюю границу SIZE_MAX байтов для любого отдельного объекта.

Ширина типа void*, общий тип указателя, налагает верхнюю границу общего размера всех объектов в исполняемой программе (которая может быть больше максимального размера одного объекта).

Стандарт C накладывает нижние границы, но не верхние границы, на эти фиксированные размеры. Никакая соответствующая реализация C не может поддерживать объекты с бесконечным размером, но в принципе может поддерживать объекты любого конечного размера. Верхние границы налагаются отдельными реализациями C, средами, в которых они работают, и физикой, а не языком.

Например, соответствующая реализация может иметь SIZE_MAX, равное 2 +1024 -1, что означает, что в принципе может иметь объекты до 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137215 байтов.

Удачи найти аппаратное обеспечение, которое фактически поддерживает такие объекты.

Сноска: нет явного правила, что ни один объект не может быть больше, чем SIZE_MAX байтов. Вы не могли бы с пользой применить оператор sizeof к такому объекту, но, как и любой другой оператор, sizeof может переполняться; это не означает, что вы не можете выполнять операции над таким объектом. Но на практике любая нормальная реализация сделает size_t достаточно большим, чтобы представить размер любого объекта, который он поддерживает.

Ответ 2

Без учета памяти максимальный размер массива ограничен типом целого числа, используемого для индексации массива.

Ответ 3

64-разрядная машина теоретически может адресовать максимум 2 ^ 64 байта памяти.

Ответ 4

C99 5.2.4.1 "Лимиты перевода" гарантируют как минимум:

Реализация должна иметь возможность переводить и выполнять хотя бы одну программу, содержащую хотя бы один экземпляр каждого из следующих ограничений: 13)

  • 65535 байт в объекте (только в размещенной среде)

13) Реализации должны избегать введения фиксированных ограничений перевода, когда это возможно.

Это говорит о том, что соответствующая реализация может отказаться от компиляции объекта (включая массивы) с более чем short байтами.

Ответ 5

Я полагаю, что самым большим теоретическим массивом будет максимальное значение "unsigned long" (или любое другое самое большое целое число, которое поддерживает последний стандарт/ваш компилятор)

Ответ 6

Размер указателя ограничит доступ к памяти, к которой вы можете получить доступ. Даже если аппаратное обеспечение поддерживает неограниченную память, если самый большой тип данных, который вы можете использовать, составляет 64 бит, вы сможете получить доступ к 2 ^ 64 байтам памяти.

Ответ 7

Я искал способ определить максимальный размер для массива. Этот вопрос, похоже, спрашивает то же самое, поэтому я хочу поделиться своими выводами.

Изначально C не предоставляет никакой функции для определения максимального количества элементов, выделяемых в массиве во время компиляции. Это связано с тем, что он будет зависеть от памяти доступного на машине, где он будет выполнен.

С другой стороны, я обнаружил, что функции выделения памяти (calloc() и malloc()) позволяют выделять более крупные массивы. Кроме того, эти функции позволяют обрабатывать ошибки выделения памяти во время выполнения.

Надеюсь, что это поможет.