Bonjour,
Je me retrouve ici à cause d'un problème qui m'échappe totalement.
Quand je veux libérer un tableau 2D, j'utilise une fonction "LibereTab2D" codé par mes soins dont voici le code :
Cette fonction, si je l'utilise, il y a presque toujours ce message d'erreur sur mon terminal : "double free or corruption (!prev) make: *** [Makefile:6: launch] Aborted (core dumped)"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void LibereTab2D(long long int **T, int n) { if(T != NULL) { for(int i=0; i<n; i++) { if (T[i] != NULL) { free(T[i]); } } free(T); } }
Je dis presque car si je fait un tableau 2D avec un nombre de colonne compris entre 1 et 7, le message d'erreur disparaît ou alors un autre prends sa place.
(je précise que j'utilise Ubuntu pour compiler mes code sources et les exécuter).
Ce tableau 2D, je le créé avec cette autre fonction codé là aussi par mes soins :
Voici un petit main() (pour celles et ceux qui veulent tester) avec les fonctions appelées tel quel dans mon projet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 long long int **creatabLL2D(int ligne, int colonne) { long long int ** Tableau = NULL; Tableau = (long long int**)calloc(ligne,sizeof(long long int*)); if (Tableau == NULL) { return NULL; } for(int i=0; i<ligne; i++) { Tableau[i] = (long long int*)calloc(colonne,sizeof(long long int)); if (Tableau[i] == NULL) { for(int j=0; j<i; j++) { free(Tableau[j]); } free(Tableau); return NULL; } } return Tableau; }
Ma question étant de savoir où est le problème et comment le résoudre. Car malgré plusieurs recherches, il m'est impossible de comprendre comment une erreur pareille peut se générer (sans me vanter, ma fonction LibereTab2D semble être parfaite).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdio.h> #include <stdlib.h> int main(){ int tailleTabAge, nbMoisTotal; long long int ** tabAge; printf("Combien de mois voulez vous simuler (par experiences) ? Tapez un entier:"); scanf("%d", &nbMoisTotal); tailleTabAge = nbMoisTotal + 9; tabAge = creatabLL2D(2, tailleTabAge); if(tabAge == NULL) { printf("ERREUR D'ALLOCATION DYNAMIQUE !\n"); exit(-5); } //manipulation du tableau tabAge LibereTab2D(tabAge, 2); return 0; }
Si une âme charitable peut éclairer ma lanterne, je lui en serais très reconnaissant.
(note : Etant nouveau ici, il est possible que j'ai posté le message sur le mauvais forum. Si tel est le cas, faite le mois savoir au plus vite, en vous remerciant d'avance pour la bienveillance)
Partager