- Polo,
Bonjour,
Au cours d'un de mes TP de C, il nous a été demandé de créer un programme simulant un tirage de l'Euromillion. Ce que j'ai fait. Le soucis c'est que j'utilise des pointeurs, et que lorsque j'utilise free à la fin pour liberer la mémoire, au bout d'en moyenne 5 executions de mon code, il râle en me mettant une erreur (qui peut changer) :
*** glibc detected *** ./01: double free or corruption (out): 0x00000000015bc010 ***
ou
*** glibc detected *** ./01: free(): invalid next size (fast): 0x00000000016a1010 ***
Voici le code en question :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #include <stdio.h> #include <stdlib.h> #include <time.h> /* * Structure contenant toutes les boules et les etoiles tirees */ typedef struct Euromillion { int boules[5]; int etoiles[2]; } Euromillion; /* * Pour générer un nombre aleatoire */ int r(int mod) { int r = rand() % mod; return r; } /* * Fonction permetant de generer les boules */ int *les_boules(int *pt_tabB) { int i; pt_tabB = (int *) malloc(sizeof(int) * 50); for(i=1;i<=50;i++) *(pt_tabB+i-1) = i; return pt_tabB; } /* * Fonction permetant de generer les etoiles */ int *les_etoiles(int *pt_tabE) { int i; pt_tabE = (int *) malloc(sizeof(int) * 9); for(i=1;i<=9;i++) *(pt_tabE+i-1) = i; return pt_tabE; } /* * Fonction permetant de tirer aleatoirement les boules et les etoiles */ Euromillion Tirage(int *pt_b,int *pt_e) { Euromillion var; int i,a=0; for(i=0;i<5;i++) { do a = r(50); // on tire un nombre aleatoire while(*(pt_b+a-1)==255); // et on recommence le tirage tant que la valeur tiree l'a deja été (donc =255) var.boules[i] = a; // on la met dans notre structure *(pt_b+a-1) = 255; // on enleve la boule de notre liste } for(i=0;i<2;i++) { do a = r(9); // on tire un nombre aleatoire while(*(pt_e+a-1)==255); // et on recommence le tirage tant que la valeur tiree l'a deja été (donc =255) var.etoiles[i] = a; // on la met dans notre structure *(pt_e+a-1) = 255; // on enleve la boule de notre liste } return var; } int main(void) { // initialisation du generateur de nombres aleatoires srand(time(NULL)); int i; int *et; int *bo; // generation des nos boules & etoiles et = les_etoiles(et); bo = les_boules(bo); // ouverture du fichier FILE *f; f = fopen("Euromillion.txt", "a"); // affichage des boules printf("===== AFFICHAGE DES BOULES/ETOILES ===== \n"); for(i=0;i<50;i++) printf("%d,", *(bo+i)); printf("\n"); for(i=0;i<9;i++) printf("%d,", *(et+i)); printf("\n"); // realisation du tirage et affichage printf("===== RESULTATS DU TIRAGE ===== \n"); Euromillion resultats = Tirage(bo,et); // on complete la structure for(i=0;i<5;i++) { // sur stdout printf("%d,", resultats.boules[i]); // dans le fichier fprintf(f, "%d ", resultats.boules[i]); } printf("\n"); // un petit tiret pour separer avec les etoiles fprintf(f, "- "); for(i=0;i<2;i++) { // sur stdout printf("%d,", resultats.etoiles[i]); // dans le fichier fprintf(f, "%d ", resultats.etoiles[i]); } printf("\n"); // et on revient la ligne fprintf(f, "\n"); // on ferme le fichier fclose(f); // et on libere nos petits pointeurs free(et); free(bo); // and... voilà return 0; } |
Les free() en question sont tout à la fin du main. Et je ne comprends pas, pourtant entre chaque execution, les malloc sont sensé se faire correctement, non ? Logiquement 1 malloc au debut = 1 free à la fin, et c'est pourtant ce que je fais :-/
Si qqun ici est capable de m'éclairer sur le pourquoi du comment de cette bizzarerie, je serait bien curieux de savoir ce qu'il se passe à l'intérieur…