具有大int的段错误-没有足够的内存?

时间:2019-03-10 23:22:20

标签: c

我对C以及数组和内存分配的工作原理还很陌生。我正在解决一个非常简单的函数vector_average(),该函数计算两个连续数组项之间的平均值,即( i )和( i < / em> + 1)。该平均功能如下:

void
vector_average(double *cc, double *nc, int n)
{
//#pragma omp parallel for
  double tbeg ;
  double tend ;
  tbeg = Wtime() ;
  for (int i = 0; i < n; i++) {
    cc[i] = .5 * (nc[i] + nc[i+1]);
  }
  tend = Wtime() ;
  printf("vector_average() took %g seconds\n", tend - tbeg);
}

我的目标是将int n设置得非常高,以至于实际上需要一些时间才能完成此循环(因此,为什么我要在这段代码中跟踪墙上的时间)。我正在通过此函数的 x f x )= sin( x )的随机测试函数+ 1/3 * sin(3 x ),在此代码中用x_nc表示为main(),格式如下:

int
main(int argc, char **argv)
{
  int N = 1.E6;
  double x_nc[N+1];

  double dx = 2. * M_PI / N;
  for (int i = 0; i <= N; i++) {
    double x = i * dx;
    x_nc[i] = sin(x) + 1./3. * sin(3.*x);
  }

  double x_cc[N];
  vector_average(x_cc, x_nc, N);
}

但是我的问题是,如果我将int N设置为大于1.E5,则会出现段错误。请提供任何有关如何提高N的建议。也许我必须对malloc做些事情,但是同样,我对所有这些东西都是陌生的,我不确定如何实现。

-CJW

1 个答案:

答案 0 :(得分:1)

在Windows或其他系统上,一个功能只有1M堆栈内存。显然,临时变量“ x_nc”的大小大于1M。因此,您应该使用堆来保存x_nc的数据:

int
main(int argc, char **argv)
{
  int N = 1.E6;
  double* x_nc = (double*)malloc(sizeof(dounble)*(N+1));

  double dx = 2. * M_PI / N;
  for (int i = 0; i <= N; i++) {
    double x = i * dx;
    x_nc[i] = sin(x) + 1./3. * sin(3.*x);
  }

  double* x_cc = (double*)malloc(sizeof(double)*N);
  vector_average(x_cc, x_nc, N);

  free(x_nc);
  free(x_cc);

  return 0;
}