【问题标题】:Array of size LONG_MAX大小为 LONG_MAX 的数组
【发布时间】:2013-09-09 11:05:46
【问题描述】:

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

【问题讨论】:

  • 您正在尝试分配 2GB x sizeof(whatever)。你认为这将如何运作?我可以向您保证,您不需要那么多空间来解决您的问题。
  • 因为会导致StackOverflow。
  • 它应该是某种地图吗?
  • 对于 32 位构建,假设 sizeof(long int) == 4,这将是 8GB 的​​数据。这甚至不适合您的进程的地址空间。 (对于 8 字节长的 64 位,这简直是令人难以置信的大。)

标签: c arrays limits variable-declaration


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案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); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-02
      • 2013-12-27
      • 2019-05-27
      • 2011-08-30
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2021-08-22
      相关资源
      最近更新 更多