Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在C中声明堆栈上的大数组会导致SEGFULT?_C_Stack - Fatal编程技术网

为什么在C中声明堆栈上的大数组会导致SEGFULT?

为什么在C中声明堆栈上的大数组会导致SEGFULT?,c,stack,C,Stack,我从这行代码中得到一个segfault: int fatblob[1820][286][5]; 这是为什么?您正在尝试分配1820*285*5*sizeof(int)bytes=10MB左右(如果sizeof(int)==4)。默认情况下,这可能比操作系统为堆栈分配提供的字节多,因此会出现堆栈溢出/segfault 您可以通过在创建线程时请求额外堆栈、在堆上分配或更改操作系统默认值来解决此问题。因为您的堆栈段小于1820*285*5ints。它通常在1MB附近。因为堆栈溢出。尝试在堆上分配该数

我从这行代码中得到一个segfault:

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

这是为什么?

您正在尝试分配
1820*285*5*sizeof(int)
bytes=10MB左右(如果
sizeof(int)==4
)。默认情况下,这可能比操作系统为堆栈分配提供的字节多,因此会出现堆栈溢出/segfault


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

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

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

C中的自动变量(默认类型)通常在堆栈上分配。堆栈是为每个线程分配的内存区域,虽然它在许多操作系统上可能会增长,但它的大小总是有限的。很好地覆盖了默认堆栈,但是如果使用线程,则在线程创建中分配新的线程(例如pthread_attr_setstacksize)。一般来说,大的分配最好在堆上完成(malloc/new),但即使这样有时也可能太小。mmap()或类似的方法有时会有所帮助

丹本的回答到哪里去了?它链接到

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

LINUX的堆栈大小为8192KB(即8MB)。所以,很明显,若您试图在堆栈上分配更多内存,将导致堆栈溢出

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

ulimit-s<你希望它是什么版本>

$ulimit-s1024

我希望它能帮助您。

*sizeof(int),在一个正常的32位系统上超过9MB。可能的重复可能的重复可能的重复
int fatblob[1820][286][5];