【发布时间】:2011-03-09 19:38:16
【问题描述】:
我从这行代码中得到一个段错误:
int fatblob[1820][286][5];
这是为什么呢?
【问题讨论】:
我从这行代码中得到一个段错误:
int fatblob[1820][286][5];
这是为什么呢?
【问题讨论】:
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
希望对你有帮助。
【讨论】:
因为你的堆栈段小于1820*285*5ints。它通常在 1MB 左右。
【讨论】:
C 中的自动变量(默认类型)通常分配在堆栈上。堆栈是为每个线程分配的内存区域,虽然它在许多操作系统上可能会增长,但它的大小总是有限的。 danben's answer 很好地涵盖了默认堆栈,但如果您使用线程,则在线程创建中分配新的堆栈(例如 pthread_attr_setstacksize)。一般来说,大的分配最好在堆上完成(malloc/new),但有时即使这样也可能太小了。 mmap() 或类似的东西有时会有所帮助。
丹本的答案去哪了?它链接到some information on stack limits。
【讨论】:
因为堆栈溢出。尝试在堆上分配该数组。
【讨论】:
您正在尝试分配 1820 * 285 * 5 * sizeof(int) 字节 = 大约 10MB(如果 sizeof(int) == 4)。这可能比您的操作系统默认为您提供的堆栈分配字节数更多,因此您会遇到堆栈溢出/段错误。
您可以通过在创建线程时请求额外的堆栈、在堆上分配或更改操作系统默认值来解决此问题。
【讨论】: