C语言中的Malloc内存损坏
我在使用malloc时遇到问题 我有一个名为雅各比gpu的函数,它被多次调用:C语言中的Malloc内存损坏,c,malloc,cuda,gpu,C,Malloc,Cuda,Gpu,我在使用malloc时遇到问题 我有一个名为雅各比gpu的函数,它被多次调用: int main(int argc, char* argv[]){ /* ... */ int totalrot=0; while(nrot>0){ iter++; nrot=jacobi_gpu(a,q, tol, dimmat); totalrot+=nrot; printf("iter =%3d nrot=%3
int main(int argc, char* argv[]){
/* ... */
int totalrot=0;
while(nrot>0){
iter++;
nrot=jacobi_gpu(a,q, tol, dimmat);
totalrot+=nrot;
printf("iter =%3d nrot=%3d\n",iter, nrot);
}
/* ... */
}
参数a、q、tol和dimmat已正确初始化。
A和Q是2个方阵,dimmat是它们的维数
这是我的密码:
int jacobi_gpu(double A[], double Q[], double tol, long int dim){
int nrot, p, q, k, tid;
double c, s;
double *mc, *vc;
printf("jacobi begins \n");
mc = (double *)malloc(2 * dim * sizeof(double));
vc = (double *)malloc(2 * dim * sizeof(double));
if( mc == NULL || vc == NULL){
fprintf(stderr, "pb allocation matricre\n");
exit(1);
}
nrot = 0;
for(k = 0; k < dim - 1; k++){
eye(mc, dim);
eye(vc, dim);
for(tid = 0; tid < floor(dim /2); tid++){
p = (tid + k)%(dim - 1);
if(tid != 0)
q = (dim - tid + k - 1)%(dim - 1);
else
q = dim - 1;
//printf("p = %d | q = %d\n", p, q);
if(fabs(A[p + q*dim]) > tol){
nrot++;
symschur2(A, dim, p, q, &c, &s);
mc[2*tid] = p; vc[2 * tid] = c;
mc[2*tid + 1] = q; vc[2*tid + 1] = -s;
mc[2*tid + 2*(dim - 2*tid) - 2] = p;
vc[2*tid + 2*(dim - 2*tid) - 2 ] = s;
mc[2*tid + 2*(dim - 2*tid) - 1] = q;
vc[2 * tid + 2*(dim - 2*tid) - 1 ] = c;
}
}
affiche(mc,dim,2,"Matrice creuse");
affiche(vc,dim,2,"Valeur creuse");
}
printf("end\n");
free(mc);
free(vc);
return nrot;
}
有什么建议吗
[编辑]
- 函数eye初始化身份矩阵
- 函数affiche显示带有行和列的矩阵。第一个参数是矩阵,第二个是行数,第三个是列数
感谢您的帮助在调用
malloc()
时,您没有为方形矩阵分配足够的内存。正确的大小应该是dim
平方,而不仅仅是2*dim
这应该可以做到:
mc = (double *)malloc(dim * dim * sizeof(double));
vc = (double *)malloc(dim * dim * sizeof(double));
据我所知,double-free或corrupt(!prev)是您在同一个指针上多次调用free(),您的其他函数可能正在这样做(我怀疑
affiche()
)。
可能在shell上导出MALLOC\u CHECK\u0后尝试运行它?标识矩阵总是正方形,但mc不是。当调用
眼睛(mc,dim)时
我怀疑eye将mc视为一个dim by dim矩阵,而实际上它是一个2 by dim矩阵,并写入未分配的内存。您的代码中一定有堆栈损坏。它会告诉您,使用调试选项编译并通过valgrind运行代码
顺便说一句,在C语言中,对
malloc
的结果进行强制转换是一个坏主意。不要这样做,它可能会隐藏缺少正确头文件的诊断。当您使用调试器单步执行代码时会发生什么事?eye()
做什么,以及什么时候会发生故障?例如,它是在第一次调用malloc()时发生的吗
还是在几次呼叫之后?就这一点而言,affiche()
做了什么?@jamesaffiche()
翻译成poster,所以我猜是一个输出包装器…所以矩阵操作可能会覆盖malloc
簿记信息。不,这是我矩阵的正确维度。这个矩阵包含2列和N行。这个矩阵的目的是存储p和q值。@larsmans:这是有意义的。当然,onc当你开始写入未分配的内存时,没有任何保证。@Dimitri:Hmm,那么就回到原点。@Dimitri:你说你的矩阵在问题中是正方形的。eye()
s有了它:)
mc = (double *)malloc(dim * dim * sizeof(double));
vc = (double *)malloc(dim * dim * sizeof(double));