为什么我在C中声明堆栈中的大型数组会得到段错误?

我从这行代码中得到了一个段错误:

int fatblob[1820][286][5]; 

这是为什么?

你试图分配1820 * 285 * 5 * sizeof(int) bytes =大约10MB(如果sizeof(int) == 4 )。 这可能比你的操作系统默认提供的堆栈分配更多的字节,所以你得到一个堆栈溢出/段错误。

您可以通过在创建线程时请求额外堆栈,在堆上分配或更改操作系统默认值来解决此问题。

因为您的堆栈段小于1820*285*5 int s。 它通常在1MB左右。

因为堆栈溢出。 尝试在堆上分配该数组。

 int fatblob[1820][286][5]; 

您试图分配一个大约9.8 MB的180 * 286 * 5 * 4(让int = 4的大小)的内存位置,因此您的操作系统上的默认堆栈大小可能会更小。

LINUX具有8192 KB(即8 MB)的堆栈大小。 因此,如果您尝试在堆栈上分配更多内存,显然您将获得堆栈溢出。

您可以尝试更改操作系统的堆栈大小。 在LINUX中,您可以尝试ulimit

ulimit -s

喜欢

$ ulimit -s 1024

我希望它会对你有所帮助。

C中的自动变量(默认类型)通常在堆栈上分配。 堆栈是每个线程分配的内存区域,虽然它可能在许多操作系统上增长,但它总是具有有限的大小。 danben的答案很好地涵盖了默认堆栈,但是如果你正在使用线程,那么你就是在线程创建中分配新的线程(例如pthread_attr_setstacksize)。 通常,在堆上(malloc / new)可以更好地完成大量分配,但有时甚至可能太小。 mmap()或类似的有时候会有所帮助。

danben的答案在哪里? 它链接到有关堆栈限制的一些信息 。