2013-09-09 6 views
1

Мне нужно объявить массив размера LONG_MAX (2147483647, в библиотеке c <limits.h>), и мне это действительно нужно для решения проблемы. Но код дает мне и ошибку: если я пишу long int v[LONG_MAX];, компилятор дает size of array 'v' is too large. Как я могу решить эту проблему?Массив размера LONG_MAX

+0

Вы пытаетесь выделить 2 ГБ x 'sizeof (независимо)'. Как вы думаете, что будет работать? Я могу заверить вас, что вам не нужно столько места, чтобы решить вашу проблему. – trojanfoe

+2

Потому что это вызовет StackOverflow. –

+2

Предполагается, что это какая-то карта? – Novak

ответ

3

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

Стандарт C (5.2.4.1) гарантирует, что программы, работающие на ОС, должны иметь объект размером 65535 байт. И независимо от того, что говорит стандарт, ОС установит лимит стека для вашего процесса.

Если вы объявите слишком большой объект, насколько это касается стандарта C, вы получите описание компилятора. В противном случае, если вы передадите эту проверку, но все равно используете слишком много стека, с вложенными вызовами функций и т. Д., Вы получите ошибку времени выполнения: переполнение стека.

Предпочтительный способ решить это - всегда выделять большие объекты, используя динамическое распределение памяти. Затем объекты выделяются в куче, а оперативная память вашего компьютера в значительной степени устанавливает предел.

2

Если вам нужно использовать такую ​​большую память, которая не может быть выделена системой, вместо этого вы можете использовать сопоставление памяти.

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);