Мне нужно объявить массив размера LONG_MAX (2147483647, в библиотеке c <limits.h>
), и мне это действительно нужно для решения проблемы. Но код дает мне и ошибку: если я пишу long int v[LONG_MAX];
, компилятор дает size of array 'v' is too large
. Как я могу решить эту проблему?Массив размера LONG_MAX
ответ
В значительной степени каждая система, которая существует, переменные, объявленные как локальные массивы с фиксированным размером, помещаются в стек.
Стандарт C (5.2.4.1) гарантирует, что программы, работающие на ОС, должны иметь объект размером 65535 байт. И независимо от того, что говорит стандарт, ОС установит лимит стека для вашего процесса.
Если вы объявите слишком большой объект, насколько это касается стандарта C, вы получите описание компилятора. В противном случае, если вы передадите эту проверку, но все равно используете слишком много стека, с вложенными вызовами функций и т. Д., Вы получите ошибку времени выполнения: переполнение стека.
Предпочтительный способ решить это - всегда выделять большие объекты, используя динамическое распределение памяти. Затем объекты выделяются в куче, а оперативная память вашего компьютера в значительной степени устанавливает предел.
Если вам нужно использовать такую большую память, которая не может быть выделена системой, вместо этого вы можете использовать сопоставление памяти.
fd=open(name, flag, mode);
if(fd<0)
...
ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0);
// use the virtual memory that ptr pointed to, like what you do with arrays.
...
munmap(p_map, len);
Вы пытаетесь выделить 2 ГБ x 'sizeof (независимо)'. Как вы думаете, что будет работать? Я могу заверить вас, что вам не нужно столько места, чтобы решить вашу проблему. – trojanfoe
Потому что это вызовет StackOverflow. –
Предполагается, что это какая-то карта? – Novak