Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的Malloc内存损坏_C_Malloc_Cuda_Gpu - Fatal编程技术网

C语言中的Malloc内存损坏

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

我在使用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=%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显示带有行和列的矩阵。第一个参数是矩阵,第二个是行数,第三个是列数
更多解释 矩阵mc的目的是存储变量p和q。这些变量包含列索引。 矩阵vc的目的是存储这些列中包含的值。 例如,如果矩阵mc的第一行是0和5(p=0,q=5),这意味着矩阵vc中的值将在列0和列5中。 如果矩阵mc中的矩阵第五行是23(p=2,q=3),这意味着vc中第五行的值将在第2列和第3列中

希望这次,我更清楚


感谢您的帮助

在调用
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()
做了什么?@james
affiche()
翻译成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));