数组LONG_MAX

时间:2013-09-09 11:05:47

标签: c arrays limits variable-declaration

我需要声明一个大小为LONG_MAX(2147483647,在c库<limits.h>中)的数组,我真的需要它来解决问题。但是代码给了我错误:如果我写long int v[LONG_MAX];,编译器会给出size of array 'v' is too large。 我该如何解决这个问题?

2 个答案:

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