Malloc corruption de la Mémoire en C

J'ai un problème à l'aide de malloc.

J'ai une fonction appelée jacobi_gpu qui est appelé de nombreuses fois :

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);
    }

    /* ... */
}

Les paramètres a,q,tol et dimmat sont correctement initialisés.
A et Q sont 2 matrices carrées et dimmat est leur dimension.

Voici mon code :

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;
}

Mon problème est dans le malloc appel sur le mc variable :

*** glibc detected *** ./jacobi_gpu: double free or corruption (!prev): 0x00000000022944a0 ***
*** glibc detected *** ./jacobi_gpu: malloc(): memory corruption: 0x0000000002294580 ***

Des conseils?

[MODIFIER]

  • La fonction œil initialise une matrice d'identité
  • La fonction affiche affiche la matrice dont les lignes et les colonnes. Le premier paramètre est la matrice, le deuxième est le nombre de lignes et le troisième est le nombre de colonne.

Plus d'explication

L'objectif de la matrice mc est de stocker les variables p et q. Ces variables contient la colonne des indices.
L'objectif de la matrice vc est de stocker les valeurs contenues dans ces colonnes.
Par exemple, si la première ligne de la matrice mc est 0 et 5 ( p = 0, q = 5), ce qui signifie que les valeurs dans la matrice de cr dans la colonne 0 et 5.
Si la matrice de la cinquième ligne de la matrice mc 2 3 ( p = 2, q = 3), ce qui signifie que les valeurs dans la cinquième ligne de cr sera dans la colonne 2 et 3.

Espère que cette fois, je suis de plus en plus clair.

Merci pour votre aide

Ce qui se passe quand vous avancez dans le code avec un débogueur?
Ce n' eye() faire, et quand la panne se produit? c'est à dire t-il se passer sur le premier appel à malloc() ou après plusieurs appels?
D'ailleurs, ce n' affiche() faire?
affiche() se traduit par l'affiche, donc je suppose une sortie de wrapper.

OriginalL'auteur Dimitri | 2011-01-06