Bonjour,
suite à la lecture de l'article : http://rperrot.developpez.com/articles/c/allocationC/
4.1. Récupération de la taille à allouer
j'ai décidé d'utiliser cette méthode pour l'écriture de mon prochain programme.
Hors; je me retrouve face à un problème lors de la libération mémoire. Voici la partie pertinente du code :
La ligne 33 produit une erreur de type
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
29
30
31
32
33
34
35
36
37
38 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(void) { int i, j, nb_cust, nb_wh_loc; nb_cust = 10; nb_wh_loc = 15; double **m_cust_whprice = malloc(nb_cust * sizeof(**m_cust_whprice)); //double **m_cust_whprice = malloc(nb_cust * sizeof(double*)); if(m_cust_whprice == NULL) { fprintf(stderr, "Erreur malloc m_cust_whprice\n"); exit(EXIT_FAILURE); } for(i = 0; i < nb_cust; ++i) { m_cust_whprice[i] = calloc(nb_wh_loc, sizeof(*m_cust_whprice)); // m_cust_whprice[i] = calloc(nb_wh_loc, sizeof(double)); if(m_cust_whprice[i] == NULL) { fprintf(stderr, "Erreur malloc m_cust_whprice indice %d \n", i); exit(EXIT_FAILURE); } for(j = 0; j < nb_wh_loc; ++j) { m_cust_whprice[i][j] = 1000.0001; } } for(i = 0; i < nb_cust; ++i) { free(m_cust_whprice[i]); } free(m_cust_whprice); return 0; }
alors que l'exécution, après un swap avec les déclarations commentées (déclarations classiques on dira) fonctionne comme attendu.free(): invalid next size (fast):
Etonnament, si je réalise un affichage de la matrice juste avant le free, l'affichage est correct, mais un passage avec gdb me montrera des valeurs non cohérentes (au niveau du free).
Que se passe-t-il ici ?
Merci
Partager