我正在尝试编写一个生成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 ***有没有人能指点我犯了什么错误?谢谢。
发布于 2012-03-25 15:13:48
这是错误的。
B = malloc(N*3*3);这是正确的。
B = malloc(sizeof(*B)*N*3*3);请注意,(double *)是多余的,它只会占用屏幕上的空间。
其他的答案都有很好的建议,他们已经被否决了,但是当N很小的时候,你的程序没有理由使用malloc。除非你知道N会变得越来越大,否则就从你的代码中删除malloc。在这里,越简单越好。
发布于 2012-03-25 15:17:34
我不确定问题出在哪里,但是你真的必须使用动态分配吗?你的N是一个常量,所以你可以写
double a[N];
double b[N];
double c[N];
double d[N];
double x[N];发布于 2012-03-25 15:24:27
我想补充一个建议。看看你的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个元素),那么动态分配可能是唯一的选择。
https://stackoverflow.com/questions/9858504
复制相似问题