1

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

4

2 回答 2

3

在几乎所有存在的系统上,声明为具有固定大小的局部数组的变量都放置在堆栈上。

C 标准 (5.2.4.1) 仅保证在操作系统上运行的程序应该能够保存大小为 65535 字节的对象。而且无论标准怎么说,操作系统都会为您的进程设置堆栈限制。

如果你声明一个太大的对象,就 C 标准而言,你会得到你描述的编译器错误。否则,如果您通过了该检查但仍然使用了过多的堆栈、嵌套函数调用等,您会收到运行时错误:堆栈溢出。

解决此问题的首选方法是始终使用动态内存分配来分配大对象。然后在堆上分配对象,并且计算机的 RAM 几乎设置了限制。

于 2013-09-09T11:24:34.940 回答
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); 
于 2013-09-09T11:26:38.180 回答