为什么我在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的答案在哪里? 它链接到有关堆栈限制的一些信息 。