可能重复:
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
.
当你把它放入其中时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)
如果你正在编写一个库,如果你的程序将继续做其他事情,请记住.