Segfault с большим int - недостаточно памяти? - PullRequest
0 голосов
/ 11 марта 2019

Я довольно плохо знаком с C и с тем, как работают массивы и распределение памяти.Сейчас я решаю очень простую функцию, vector_average(), которая вычисляет среднее значение между двумя последовательными записями массива, т. Е. Среднее значение между ( i ) и ( i +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, это segfaults.Пожалуйста, предоставьте любые предложения о том, как я могу установить N намного выше.Возможно, мне нужно что-то сделать с malloc, но, опять же, я новичок во всем этом, и я не совсем уверен, как бы я это реализовал.

-CJW

1 Ответ

1 голос
/ 11 марта 2019

Функция имеет только 1M стековой памяти в Windows или другой системе.Очевидно, что размер временной переменной '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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...