简体   繁体   中英

Segfault with large int - not enough memory?

I am fairly new to C and how arrays and memory allocation works. I'm solving a very simple function right now, vector_average() , which computes the mean value between two successive array entries, ie, the average between ( i ) and ( i + 1). This average function is the following:

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);
}

My goal is to set int n extremely high, to the point where it actually takes some time to complete this loop (hence, why I am tracking wall time in this code). I'm passing this function a random test function of x , f ( x ) = sin( x ) + 1/3 * sin(3 x ), denoted in this code as x_nc , in main() in the following form:

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);
}

But my problem here is that if I set int N any higher than 1.E5, it segfaults. Please provide any suggestions for how I might set N much higher. Perhaps I have to do something with malloc , but, again, I am new to all of this stuff and I'm not quite sure how I would implement this.

-CJW

A function only has 1M stack memory on Windows or other system. Obviously, the size of temporary variable 'x_nc' is bigger than 1M. So, you should use heap to save data of 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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM