编辑:问题现已解决,感谢所有
所以我正在为C课程的最后一部分编写代码。我写了一个函数FastDFS,它执行傅立叶变换。下面的代码应该针对不同的输入大小为这个过程计时。
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
#include <math.h>
#include <time.h>
void FastDFS(complex double *, complex double *, complex double *, complex double *, int, int);
void print_complex_vector(complex double *, int);
void free_complex_vector(complex double *);
complex double *make_complex_vector(int);
complex double *MakeWpowers(int);
int main(void)
{
int i,N, operations_required;
int index_counter = 1;
double initial_time, final_time, time_taken, mega_flops_rate;
complex double *mega_flops_vector = make_complex_vector(21);
for(N = 2; N <= pow(2,20); N = N * 2)
{
complex double *Wp = MakeWpowers(N);
complex double *y = make_complex_vector(N);
complex double *x = make_complex_vector(N);
complex double *w = make_complex_vector(N);
printf("N = %dn",N);
operations_required = 1024;
for(i = 1; i <= N; i++)
{
y[i] = i;
}
initial_time = clock();
FastDFS(x,y,w,Wp,N,1);
final_time = clock();
time_taken = (final_time - initial_time) / CLOCKS_PER_SEC;
mega_flops_rate = operations_required / (time_taken * pow(10,6));
free(Wp);
free(y);
free(x);
free(w);
}
return(0);
}
代码在原来的基础上略有简化,但包含相同的错误。在某个阶段,返回错误"timings.out(49621,0x7fff7e684300)malloc:***对象0x7f81ca80c208的错误:释放的对象的校验和不正确-对象可能在释放后被修改。"或分段错误:11。程序崩溃的地方在不同的运行中有所不同,但从未得到部分N=8192。
我已经编写了一个主要函数来测试代码,并且不会遇到这些错误。main使用相同的函数(make_complex_vector等)。我能看到的一个区别是,我没有释放任何指针,因为我一次只测试一个N值,但我不明白这怎么会导致它崩溃?我可以运行的代码的N值比这个值大得多。
有人看到这里有什么明显的问题吗?非常感谢
您正在从1->N迭代并分配给y
。在C中,数组是0索引的。例如,如果您创建一个大小为5的数组,则元素的编号如下:
[a[0], a[1], a[2], a[3], a[4]]
(5个元素,编号0-4)
所以不是
for(i = 1; i <= N; i++)
你真正想要的是
for(i = 0; i < N; i++)
否则,您将写入已分配内存的末尾。如果你想让向量的第一个元素是1,写这样的东西:
for(i = 0; i < N; i++)
{
y[i] = i + 1;
}
(我假设make_complex_vector(N)
分配大小为N
的阵列)。