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 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
Vous devez vous connecter pour publier un commentaire.
Identité matrices sont toujours carrés, mais mc ne l'est pas. Lorsque vous appelez
eye(mc, dim)
je soupçonne que l'œil traite mc comme c'est un dim dim matrice est en fait un 2 dim matrice, et écrit à la mémoire non allouée.eye()
s avoir:)
OriginalL'auteur Null Set
Vous n'êtes pas d'allouer suffisamment de mémoire pour une matrice carrée à votre appel à l'
malloc()
. La taille correcte seraitdim
au carré, et pas seulement2*dim
.Cela devrait faire l'affaire:
malloc
comptabilité info.Nope, c'est la bonne dimension de ma matrice. Cette matrice contient 2 colonnes et N lignes. L'application de cette matrice est de stocker les valeurs de p et q.
Qui fait sens. Bien sûr, une fois que vous commencer à écrire pour non-alloué de la mémoire, il n'y a pas de garanties.
Hmm, puis c'est le retour à la case départ.
Vous avez dit que votre matrices carrées dans la question.
OriginalL'auteur e.James
Aussi loin que je peux dire à la
double free or corruption (!prev)
est que vous êtes en appeler free() plusieurs fois sur le même pointeur, vos autres fonctions pourraient être capables de faire cela (je soupçonneaffiche()
.Peut-être essayer de l'exécuter après
export MALLOC_CHECK_=0
sur votre shell?OriginalL'auteur fbstj
Vous devez disposer d'une corruption de la pile quelque part dans votre code. Compiler avec les options de débogage et d'exécuter votre code par valgrind, il vous le dira.
BTW, C casting de la suite de
malloc
est une mauvaise idée. Ne le faites pas, il peut masquer le diagnostic de l'absence d', y compris le bon fichier d'en-tête.OriginalL'auteur Jens Gustedt