我正在尝试编写一个生成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 ***
有人能指导我做错了什么吗?谢谢。
答案 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个元素),那么动态分配可能是唯一的方法。