C中的Malloc内存损坏
我使用malloc时遇到问题。
我有一个名为jacobi_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=%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 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; }
我的问题是在mc变量的malloc调用中:
*** glibc detected *** ./jacobi_gpu: double free or corruption (!prev): 0x00000000022944a0 *** *** glibc detected *** ./jacobi_gpu: malloc(): memory corruption: 0x0000000002294580 ***
任何建议?
[编辑]
- 函数眼初始化单位矩阵
- 函数affiche用行和列显示矩阵。 第一个参数是矩阵,第二个是行数,第三个是列数。
更多解释
矩阵mc的目的是存储变量p和q。 这些变量包含列索引。 矩阵vc的目的是存储这些列中包含的值。 例如,如果矩阵mc的第一行是0和5(p = 0,q = 5),这意味着矩阵vc中的值将在第0列和第5列中。如果矩阵中的第五行是矩阵mc是2 3(p = 2,q = 3),这意味着vc中第五行中的值将在第2列和第3列中。
希望这次,我更清楚。
谢谢你的帮助
身份矩阵总是正方形,但mc不是。 当你调用eye(mc, dim)
我怀疑是眼睛对待mc,因为当它实际上是一个2乘以昏暗的矩阵时它会被昏暗的矩阵调暗,并写入未分配的内存。
在调用malloc()
没有为方阵分配足够的内存。 正确的大小将是dim
平方,而不仅仅是2*dim
。
这应该是诀窍:
mc = (double *)malloc(dim * dim * sizeof(double)); vc = (double *)malloc(dim * dim * sizeof(double));
据我所知, double free or corruption (!prev)
是你在同一个指针上多次调用free(),你的其他函数可能正在这样做(我怀疑是affiche()
。也许尝试运行之后)在shell上export MALLOC_CHECK_=0
?
您的代码中必须存在堆栈损坏。 通过valgrind编译调试选项并运行代码,它会告诉你。
顺便说一下,在C铸造中, malloc
的结果是个坏主意。 不要这样做,它可能会隐藏缺少包含正确头文件的诊断。