我对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
答案 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;
}