我需要声明一个大小为LONG_MAX(2147483647,在c库<limits.h>
中)的数组,我真的需要它来解决问题。但是代码给了我错误:如果我写long int v[LONG_MAX];
,编译器会给出size of array 'v' is too large
。
我该如何解决这个问题?
答案 0 :(得分:3)
在几乎所有存在的系统上,声明为具有固定大小的本地数组的变量都放在堆栈中。
C标准(5.2.4.1)仅保证在OS上运行的程序应该能够容纳大小为65535字节的对象。无论标准是什么,操作系统都会为您的流程设置堆栈限制。
如果声明一个太大的对象,就C标准而言,则会出现您描述的编译器错误。否则,如果您通过该检查但仍然使用了太多堆栈,使用嵌套函数调用等,则会出现运行时错误:堆栈溢出。
解决此问题的首选方法是始终使用动态内存分配来分配大对象。然后在堆上分配对象,并且计算机的RAM几乎设置了限制。
答案 1 :(得分: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);