C-大型阵列-分段故障(堆芯转储)
我得到错误“分段错误(核心转储) 如果循环=207500或更小,这两种方法中的任何一种都有效。但是如果我增加这个值(例如2100000),我会得到错误C-大型阵列-分段故障(堆芯转储),c,arrays,C,Arrays,我得到错误“分段错误(核心转储) 如果循环=207500或更小,这两种方法中的任何一种都有效。但是如果我增加这个值(例如2100000),我会得到错误 #include <stdlib.h> void main() { long i; long loops; loops = 2075000; // works loops = 2100000; // Segmentation fault (core dumped) if (1) { in
#include <stdlib.h>
void main()
{
long i;
long loops;
loops = 2075000; // works
loops = 2100000; // Segmentation fault (core dumped)
if (1) {
int arr[loops]; // stack array
for (i = 0; i < loops; i++) {
arr[i] = 3;
}
}
if (1) {
int *arr = (int *) malloc(sizeof(int) * loops); // heap array
for (i = 0; i < loops; i++) {
arr[i] = 3;
}
}
}
#包括
void main()
{
龙我;
长环;
循环=207500;//有效
loops=2100000;//分段故障(堆芯转储)
如果(1){
int arr[loops];//堆栈数组
对于(i=0;i
我正在通过虚拟盒使用Ubuntu12.04 LTS,并分配了8gb ram。您的堆栈溢出,与堆相比,堆栈空间非常有限。您可以找到以下列出的典型堆栈大小:
另一种方法是通过
malloc
动态分配您的数组,这将使用更丰富的堆。您所做的是产生堆栈溢出的经典方法!在操作系统中,堆栈大小有一个ulimit。在linux中,defaulit是8192K。您的程序将使用堆栈:2100000*4字节/1024字节=8203K比默认大小更大。如何在linux中使用:ulimit-s:stack size(kbytes)8192我可以建议对代码进行一些改进吗?如果(1)中的行绝对没有意义。此外,一些C编译器不允许您使用变量初始化数组:int arr[loops];
不会始终编译。
platform default size
=====================================
SunOS/Solaris 8172K bytes
Linux 8172K bytes
Windows 1024K bytes
cygwin 2048K bytes