There is no fixed limit to the size of an array in C.
The size of any single object, including of any array object, is limited by SIZE_MAX
, the maximum value of type size_t
, which is the result of the sizeof
operator. (It’s not entirely clear whether the C standard permits objects larger than SIZE_MAX
bytes, but in practice such objects are not supported; see footnote.) Since SIZE_MAX
is determined by the implementation, and cannot be modified by any program, that imposes an upper bound of SIZE_MAX
bytes for any single object. (That’s an upper bound, not a least upper bound; implementations may, and typically do, impose smaller limits.)
The width of the type void*
, a generic pointer type, imposes an upper bound on the total size of all objects in an executing program (which may be larger than the maximum size of a single object).
The C standard imposes lower bounds, but not upper bounds, on these fixed sizes. No conforming C implementation can support infinite-sized objects, but it can in principle support objects of any finite size. Upper bounds are imposed by individual C implementations, by the environments in which they operate, and by physics, not by the language.
For example, a conforming implementation could have SIZE_MAX
equal to 21024-1, which means it could in principle have objects up to 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137215 bytes.
Good luck finding hardware that actually supports such objects.
Footnote: There is no explicit rule that no object can be bigger than SIZE_MAX
bytes. You couldn’t usefully apply the sizeof
operator to such an object, but like any other operator, sizeof
can overflow; that doesn’t mean you couldn’t perform operations on such an object. But in practice, any sane implementation will make size_t
big enough to represent the size of any object it supports.