2015-04-22 2 views
1

Je suis novice en programmation C et je n'ai pas trouvé de solution à mon problème. Bien que le code fonctionne (je suis en mesure de l'inclure dans un autre programme), quand il tente de libérer la mémoire allouée par calloc(), elle renvoie l'erreur suivante:Libérer un tableau de mpc_t en C

free(): invalid next size (normal): 

followd par ce qui semble être une adresse mémoire. J'utilise des bibliothèques mpc (pour des nombres complexes de précision arbitraire). C'est le plus petit programme qui répète l'erreur:

#include <stdio.h> 
#include <stdlib.h> 
#include <gmp.h> 
#include <mpfr.h> 
#include <mpc.h> 

int N = 10; 
int precision = 512; 

int main(void) { 
    mpc_t *dets2; 
    dets2 = (mpc_t*)calloc(N-2,sizeof(mpc_t)); 

    for (int i = 0; i<=N-2; i++) { 
     mpc_init2(dets2[i],512); //initialize all complex numbers 
     mpc_set_str(dets2[i],"1",0,MPFR_RNDN); //set all the numbers to one 
    } 

    free(dets2); //release the memory occupied by those numbers 
    return 0; 
} 

Merci pour votre aide!

+4

la condition dans votre boucle for doit être 'i mch

+3

@mch - bonne prise; votre commentaire devrait être une réponse. –

+0

Merci @mch! Cela résout le problème. Donc, ce que j'essaie de faire avec mon code erroné est de stocker N-1 mpf_t dans un espace qui ne peut gérer que N-2 mpf_t. Je pensais que cela aurait produit une erreur de segmentation, ou quelque chose comme ça. –

Répondre

2

Votre boucle pour rupture après i == N-2, mais il devrait casser avant. La condition dans votre boucle for doit être i<N-2 au lieu de i<=N-2.

Donc, vous essayez d'accéder à la mémoire, ce qui est hors limites. Cela conduit à undefined behaviour, donc tout peut arriver, y compris une erreur de segmentation, une erreur de temps libre ou rien.

+0

Merci! Je ferai plus attention la prochaine fois. –