C主要的最大尺寸

Ius*_*tin 5 c memory

可能重复:
C编程,为什么这个大型数组声明会产生分段错误?

这是我第一次来这里,如果我违反了一些规则,或者之前已经回答了这个问题,那就很抱歉.我最近做了一个C程序,其中有一个矩阵

char buff[NR][1024*1024];
Run Code Online (Sandbox Code Playgroud)

我需要NR = 128.因此该程序将需要128MB.这是在main()中.我在几个系统上尝试了它,内存足够,编译时没有错误.在运行时,我收到了所有系统上的分段错误.它适用于NR = 7,但不是8.我将该代码移到main之外,使其成为全局代码.即使对于128,它也不会崩溃.有谁知道为什么会这样?编译器是GCC

Mar*_*ers 16

问题是你的堆栈溢出通常只有几MB(确切的大小取决于系统和你的编译器选项).您可以使用分配堆上的内存malloc.

  • @JAB,是的,全局变量**非常糟糕**.我会说#1最佳实践规则永远不会使用全局变量.(当然,全局const表也没问题.)如果你需要一个太大而无法在堆栈上可靠分配的对象,请使用`malloc`! (2认同)
  • 或者甚至在静态内存中添加`static`存储类限定符. (2认同)

int*_*ger 5

当你把它放入其中时main(),在堆栈上分配128MB,并且堆栈通常是有限的,其限制因系统而异.有些可能只允许你8MB,其他可能你可以使用 - 你的限制似乎是8MB,这是大多数Linux平台的标准.如果这是类似POSIX的环境,您可以尝试使用控制限制ulimit -s.

当您将声明取出main()并使其静止时,它将最终出现在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;
Run Code Online (Sandbox Code Playgroud)

您也可以单独分配每个MB块,但是我这样做是为了让您希望整个区域在内存中连续.free(bufp)如果你正在编写一个库,如果你的程序将继续做其他事情,请记住.