代码之家  ›  专栏  ›  技术社区  ›  Iustin

C最大主尺寸[副本]

  •  5
  • Iustin  · 技术社区  · 14 年前

    可能重复:
    C programming, why does this large array declaration produce a segmentation fault?

    我最近做了一个C程序,其中有一个

    char buff[NR][1024*1024];
    

    我需要NR=128。所以这个程序将有128MB。这是在main()中。我在一些有足够内存的系统上试过,编译时没有错误。在运行时,我收到所有系统上的分段错误。它对NR=7有效,但对8无效。 我把代码移到了main之外,使之全球化。即使是128年也没有崩溃。 有人知道为什么会这样吗?

    6 回复  |  直到 7 年前
        1
  •  16
  •   Mark Byers    14 年前

    问题是堆栈溢出,通常只有几MB大小(具体大小取决于系统和编译器选项)。您可以在堆上分配内存,而不是使用 malloc .

        2
  •  5
  •   integer    14 年前

    当你把它放进去的时候 main() ulimit -s .

    并使其成为静态的,它将结束在BSS段中(除非对其进行初始化),并且在大多数系统上仅受堆空间的限制(通常非常大和/或不受限制)。看到了吗 http://en.wikipedia.org/wiki/Data_segment

    但是,如果您希望在本地和临时使用,请考虑自己分配NR兆字节:

    #define MB (1024*1024)
    char *bufp = malloc(NR*MB)
    char *buf[NR];
    int i;
    
    for (i = 0; i < NR; i++)
      buf[i] = bufp + i*MB;
    

    您也可以分别分配每个MB块,但我是这样做的,以防您希望整个区域在内存中是连续的。记住 free(bufp)

        3
  •  1
  •   SigTerm    14 年前

    可能的解决方案:

    1. 使数组全局化。
    2. 使数组为静态。

    使变量为全局/静态将导致(至少在我见过的编译器上)它被分配到堆栈之外的数据或代码段中,这不会影响堆栈大小。

        4
  •  0
  •   Kurovsky    14 年前

    或者可以增加程序的堆栈分配大小。例如,在VS 2008中,转到项目属性->链接器->并设置堆栈提交大小。

        5
  •  0
  •   user393170    14 年前

        6
  •  -4
  •   Sjoerd    14 年前

    使用诸如gdb之类的调试器来确定分段错误发生的确切位置。