What is the maximum size of an array in C?
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.
What is the Maximum Size that an Array can hold?
System.Int32.MaxValue
Assuming you mean System.Array
, ie. any normally defined array (int[]
, etc). This is the maximum number of values the array can hold. The size of each value is only limited by the amount of memory or virtual memory available to hold them.
This limit is enforced because System.Array
uses an Int32
as it's indexer, hence only valid values for an Int32
can be used. On top of this, only positive values (ie, >= 0
) may be used. This means the absolute maximum upper bound on the size of an array is the absolute maximum upper bound on values for an Int32
, which is available in Int32.MaxValue
and is equivalent to 2^31, or roughly 2 billion.
On a completely different note, if you're worrying about this, it's likely you're using alot of data, either correctly or incorrectly. In this case, I'd look into using a List<T>
instead of an array, so that you are only using as much memory as needed. Infact, I'd recommend using a List<T>
or another of the generic collection types all the time. This means that only as much memory as you are actually using will be allocated, but you can use it like you would a normal array.
The other collection of note is Dictionary<int, T>
which you can use like a normal array too, but will only be populated sparsely. For instance, in the following code, only one element will be created, instead of the 1000 that an array would create:
Dictionary<int, string> foo = new Dictionary<int, string>();
foo[1000] = "Hello world!";
Console.WriteLine(foo[1000]);
Using Dictionary
also lets you control the type of the indexer, and allows you to use negative values. For the absolute maximal sized sparse array you could use a Dictionary<ulong, T>
, which will provide more potential elements than you could possible think about.
Do Java arrays have a maximum size?
Haven't seen the right answer, even though it's very easy to test.
In a recent HotSpot VM, the correct answer is Integer.MAX_VALUE - 5
. Once you go beyond that:
public class Foo {
public static void main(String[] args) {
Object[] array = new Object[Integer.MAX_VALUE - 4];
}
}
You get:
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
Array declared with maximum size throws OutOfMemoryException in C#
The NET framework limits the maximum size of any object to 2 GB by default. Arrays can be bigger on 64-bit platforms if you enable the corresponding setting gcAllowVeryLargeObjects.
So theoretically, the limit of an int
array should be around 536 870 912 elements, but that doesn't account for the memory footprint of the array itself, therefore the real limit must be less.
Another issue is that arrays need to be allocated in contiguous memory space. If the allocator can't find any such space, you will get an OutOfMemoryException
even if the object is under the maximum size limit.
Why I can't create an array with large size?
Theory
There are two possible exceptions:
OutOfMemoryError: Java heap space
means your array does not fit into java heap space. In order to solve you can increase the maximum heap size by using JVM option-Xmx
. Also take into account that the maximum size of object cannot be larger than the largest heap generation.OutOfMemoryError: Requested array size exceeds VM limit
means platform-specific size was exceeded:- the upper bound limit is set by the restrictions of the size type used to describe an index in the array, so theoretical array size is limited by
2^31-1=2147483647
elements. - the other limit is JVM/platform specific. According to chapter 10: Arrays of The Java Language Specification, Java SE 7 Edition there is no strict limit on array length, thus array size may be reduced without violating JLS.
- the upper bound limit is set by the restrictions of the size type used to describe an index in the array, so theoretical array size is limited by
Practice
In HotSpot JVM array size is limited by internal representation. In the GC code JVM passes around the size of an array in heap words as an int
then converts back from heap words to jint
this may cause an overflow. So in order to avoid crashes and unexpected behavior the maximum array length is limited by (max size - header size). Where header size depends on C/C++ compiler which was used to build the JVM you are running(gcc for linux, clang for macos), and runtime settings(like UseCompressedClassPointers
). For example on my linux:
- Java HotSpot(TM) 64-Bit Server VM 1.6.0_45 limit
Integer.MAX_VALUE
- Java HotSpot(TM) 64-Bit Server VM 1.7.0_72 limit
Integer.MAX_VALUE-1
- Java HotSpot(TM) 64-Bit Server VM 1.8.0_40 limit
Integer.MAX_VALUE-2
Useful Links
- https://bugs.openjdk.java.net/browse/JDK-8059914
- https://bugs.openjdk.java.net/browse/JDK-8029587
Maximum size of string array in C#
Array Class
By default, the maximum size of an Array is 2 gigabytes (GB). In a
64-bit environment, you can avoid the size restriction by setting the
enabled attribute of the gcAllowVeryLargeObjects configuration element
to true in the run-time environment. However, the array will still be
limited to a total of 4 billion elements, and to a maximum index of
0X7FEFFFFF in any given dimension (0X7FFFFFC7 for byte arrays and
arrays of single-byte structures).
Very useful comment by Ňuf
But is should be noted that strings themself do not count towards the
2GB size limit, because the array contains only references to these
strings. So the maximal number of elements in string array is approx.
500M in 32bit process and 2G in 64bit process. Also this limit only
applies to .NET CLR, other implementations may have different limits
(e.g. Mono on 64bit supports even larger arrays with
–enable-big-arrays option)
Is there a max array length limit in C++?
There are two limits, both not enforced by C++ but rather by the hardware.
The first limit (should never be reached) is set by the restrictions of the size type used to describe an index in the array (and the size thereof). It is given by the maximum value the system's std::size_t
can take. This data type is large enough to contain the size in bytes of any object
The other limit is a physical memory limit. The larger your objects in the array are, the sooner this limit is reached because memory is full. For example, a vector<int>
of a given size n typically takes multiple times as much memory as an array of type vector<char>
(minus a small constant value), since int
is usually bigger than char
. Therefore, a vector<char>
may contain more items than a vector<int>
before memory is full. The same counts for raw C-style arrays like int[]
and char[]
.
Additionally, this upper limit may be influenced by the type of allocator
used to construct the vector
because an allocator
is free to manage memory any way it wants. A very odd but nontheless conceivable allocator could pool memory in such a way that identical instances of an object share resources. This way, you could insert a lot of identical objects into a container that would otherwise use up all the available memory.
Apart from that, C++ doesn't enforce any limits.
Why is the maximum size of an array too large ?
The limit SIZE_MAX / 2 comes from the definitions of size_t and ptrdiff_t on your implementation, which choose that the types ptrdiff_t and size_t have the same width.
C Standard mandates1 that type size_t is unsigned and type ptrdiff_t is signed.
The result of difference between two pointers, will always2 have the type ptrdiff_t. This means that, on your implementation, the size of the object must be limited to
PTRDIFF_MAX, otherwise a valid difference of two pointers could not be represented in type ptrdiff_t, leading to undefined behavior.
Thus the value SIZE_MAX / 2 equals the value PTRDIFF_MAX. If the implementation choose to have the maximum object size be SIZE_MAX, then the width of the type ptrdiff_t would have to be increased. But it is much easier to limit the maximum size of the object to SIZE_MAX / 2, then it is to have the type ptrdiff_t have a greater or equal positive range than that of type size_t.
Standard offers these3 comments4 on the topic.
(Quoted from ISO/IEC 9899:201x)
1 (7.19 Common definitions 2)
The types are
ptrdiff_t
which is the signed integer type of the result of subtracting two pointers;
size_t
which is the unsigned integer type of the result of the sizeof operator;
2 (6.5.6 Additive operators 9)
When two pointers are subtracted, both shall point to elements of the same array object,
or one past the last element of the array object; the result is the difference of the
subscripts of the two array elements. The size of the result is implementation-defined,
and its type (a signed integer type) is ptrdiff_t defined in the header.
If the result is not representable in an object of that type, the behavior is undefined.
3 (K.3.4 Integer types 3)
Extremely large object sizes are frequently a sign that an object’s size was calculated
incorrectly. For example, negative numbers appear as very large positive numbers when
converted to an unsigned type like size_t. Also, some implementations do not support
objects as large as the maximum value that can be represented by type size_t.
4 (K.3.4 Integer types 4)
For those reasons, it is sometimes beneficial to restrict the range of object sizes to detect
programming errors. For implementations targeting machines with large address spaces,
it is recommended that RSIZE_MAX be defined as the smaller of the size of the largest
object supported or (SIZE_MAX >> 1), even if this limit is smaller than the size of
some legitimate, but very large, objects. Implementations targeting machines with small
address spaces may wish to define RSIZE_MAX as SIZE_MAX, which means that there is no object size that is considered a runtime-constraint violation.
Related Topics
Prevent Caching in ASP.NET MVC for Specific Actions Using an Attribute
How to Properly Exit a C# Application
How to Merge Multiple Assemblies into One
How to Apply Orderby on an Iqueryable Using a String Column Name Within a Generic Extension Method
Design - Where Should Objects Be Registered When Using Windsor
Effective Way to Find Any File's Encoding
Fixed Size Queue Which Automatically Dequeues Old Values Upon New Enques
Using Linq to Group a List of Objects into a New Grouped List of List of Objects
Specifying a Custom Datetime Format When Serializing with JSON.Net
Creating a Generic<T> Type Instance with a Variable Containing the Type
How to Get JSON.Net to Serialize Members of a Class Deriving from List<T>
C# Equivalent of SQL Server Datatypes
Difference Between Invariantculture and Ordinal String Comparison
Using C# to Check If String Contains a String in String Array
Why Can't I Use the 'Await' Operator Within the Body of a Lock Statement
How to Check If a Type Is a Subtype or the Type of an Object