在C中使用自由命令时出错

时间:2012-03-25 07:11:32

标签: c dynamic-memory-allocation

我正在尝试编写一个生成N个3x3矩阵的函数(递归加倍算法)。以下代码会产生错误。

#define N 4

#include<stdio.h>
#include<stdlib.h>

void CReduce(double*,double*,double*,double*,double*); //Cyclic reducer

int main()
{
    double *a,*b,*c,*d,*x;
    int size = N*sizeof(double);
    int i;

    a = (double*)malloc(size);
    b = (double*)malloc(size);
    c = (double*)malloc(size);
    d = (double*)malloc(size);
    x = (double*)malloc(size);

    //assign vector values-change later
    for(i=0;i<N;i++)
    {
        b[i] = 2.0;
        a[i] = c[i] = -1.0;
        d[i] = 0.0;
    }
    d[N-1] = 1.0;
    a[0] = 1.0;
    c[N-1] = 1.0;

    CReduce(a,b,c,d,x);

    //for(i=0;i<N;i++) printf("%d %lf\n",i,x[i]);

    free(a);
    free(b);
    free(c);
    free(d);
    free(x);

    return 0;
}

void CReduce(double* a,double* b,double* c,double* d,double* x)
{
    double *B,*C;
    int i;

    B = (double*)malloc(N*3*3);
    C = (double*)malloc(N*3*3);

    a[0] = 1.0;
    c[N-1] = 1.0;

    for(i=0;i<N*3*3;i++) B[i]=C[i]=0.0;

    free(B);
    free(C);
}

我还没有完全完成代码,但是在运行代码时它已经产生了以下错误。

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x00000000023f4100 ***

有人能指导我做错了什么吗?谢谢。

3 个答案:

答案 0 :(得分:2)

这是错误的。

B = malloc(N*3*3);

这是对的。

B = malloc(sizeof(*B)*N*3*3);

请注意,(double *)是多余的,只会占用屏幕上的空间。

其他答案有很好的建议,他们已被低估,但当N很小时,您的程序没有理由使用malloc。除非您知道 N会变大,否则请从代码中删除malloc。在这里,更简单更好。

答案 1 :(得分:0)

我不确定问题出在哪里,但你真的必须使用动态分配吗?你的N是常数,所以你可以写

double a[N];
double b[N];
double c[N];
double d[N];
double x[N];

答案 2 :(得分:0)

我想补充一点建议。看看你的CReduce功能 -

B = (double*)malloc(N*3*3);
C = (double*)malloc(N*3*3);

............

free(B);
free(C);

每当你在同一个函数中看到内存分配和内存释放时,你应该考虑删除动态分配并使用简单的数组,这样可以更好地完成相同的工作 -

double B[N*3*3];
double C[N*3*3];

但是,根据平台,编译器等,数组大小存在一定的限制。如果声明中的数组长度非常大,则会报告错误。因此,如果您需要一个非常大的数组(如超过100000个元素),那么动态分配可能是唯一的方法。