繁体   English   中英

细分错误/ malloc错误?

[英]segmentation fault / malloc error?

编辑:现在解决问题,谢谢大家

因此,我正在为最后的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 = %d\n",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。

我编写了一个主要功能来测试代码,并且不会遇到这些错误。 主要使用相同的功能(make_complex_vector等)。 我可以看到的区别是,我一次不对主指针中的任何指针进行释放,因为我一次只针对一个N值对其进行测试,但是我不知道这如何导致它崩溃? 我可以在代码中运行比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的数组)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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