Чтобы ответить на ваш заглавный вопрос: размер массива в C
ограничен (теоретически) только максимальным значением, которое может быть представлено переменной size_t
. Обычно это 32-разрядное или 64-разрядное целое число без знака, поэтому вы можете иметь (для 32-разрядного случая) более 4 миллиардов элементов (или гораздо больше в 64-разрядных системах).
ОднакоТо, что вы, вероятно, встречаете в своем коде, - это ограничение памяти, доступной программе, где строка int array[3000];
объявляет автоматическую переменную. Пространство для них обычно выделяется в стеке - который является частью памяти ограниченного размера, доступной при вызове функции (или main
). Эта память имеет ограниченный размер, и в вашем случае (при условии 32-разрядных 4-байтовых целых чисел) вы берете из стека 12 000 байт, что может вызвать проблемы.
Есть два (может быть, больше?)способы решить проблему. Во-первых, вы можете объявить массив static
- это заставит компилятор предварительно выделить память, поэтому его не нужно будет извлекать из стека во время выполнения:
static int array[3000];
секунду,вероятно, лучше, если бы подходил вызов malloc
для выделения памяти для массива;это назначает память из heap - которая имеет (почти на всех системах) значительно больше места, чем стек. Он часто ограничен только доступной виртуальной памятью операционной системы (много гигабайт на большинстве современных ПК):
int *array = malloc(3000 * sizeof(int));
Кроме того, преимущество использования malloc
состоит в том, что если по какой-то причиненедостаточно памяти, функция вернет NULL
, и вы можете проверить это. Вы можете получить доступ к элементам массива таким же образом, например, используя array[i]
. Конечно, вы должны быть уверены, что освободите память, когда закончите с ней, в конце вашей функции:
free(array);
(Это будет сделано автоматически в вашем случае, когда программа выйдет,но это хороший стиль кодирования, чтобы привыкнуть делать это явно!)