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 :

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;
}
La ligne 33 produit une erreur de type

free(): invalid next size (fast):
alors que l'exécution, après un swap avec les déclarations commentées (déclarations classiques on dira) fonctionne comme attendu.

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