C-大型阵列-分段故障(堆芯转储)

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

我得到错误“分段错误(核心转储)

如果循环=207500或更小,这两种方法中的任何一种都有效。但是如果我增加这个值(例如2100000),我会得到错误

#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