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的结果是个坏主意。 不要这样做,它可能会隐藏缺少包含正确头文件的诊断。