IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Remarque sur l'article "Allocation dynamique en C"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut Remarque sur l'article "Allocation dynamique en C"
    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

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Il faut mettre double **m_cust_whprice = malloc(nb_cust * sizeof(*m_cust_whprice)); (un * devant le m_cust_whprice du sizeof) à la place de double **m_cust_whprice = malloc(nb_cust * sizeof(**m_cust_whprice)); et m_cust_whprice[i] = calloc(nb_wh_loc, sizeof(**m_cust_whprice)); à la place m_cust_whprice[i] = calloc(nb_wh_loc, sizeof(*m_cust_whprice));. Les lignes que tu as commentées sont pourtant bonnes. Tu as mal compris l'article .

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    double **m_cust_whprice = malloc(nb_cust * sizeof(**m_cust_whprice));
    **m_cust_whprice est un double, et ceci équivaut à double **m_cust_whprice = malloc(nb_cust * sizeof(double));ce qui n'est pas ce qui est espéré (même si il est probable qu'un double n'occupe pas moins de place qu'un double*). On attend double **m_cust_whprice = malloc(nb_cust * sizeof *m_cust_whprice);.

    m_cust_whprice[i] = calloc(nb_wh_loc, sizeof(*m_cust_whprice));
    *m_cust_whprice est un double * et ceci équivaut à m_cust_whprice[i] = calloc(nb_wh_loc, sizeof(double*)); ce qui n'est pas ce qui est espéré. Il est probable qu'un double occupe plus de place qu'un double* et que la place allouée n'est pas suffisante pour stocker nb_wh_loc double et que le remplissage du tableau déborde la zone mémoire allouée.
    On attend m_cust_whprice[i] = calloc(nb_wh_loc, sizeof **m_cust_whprice);.

  4. #4
    Membre éclairé Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    C'est claire dit comme ça,
    juste une petite précision sur mes lignes commentées, il s'agissait de la méthode "classique" et donc fonctionnelle. Mais je voulais faire ces définitions suivant la "méthode" précisée dans l'article.

    Bonne journée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faites part de vos remarques sur les articles MySQL
    Par ced dans le forum Contribuez
    Réponses: 0
    Dernier message: 26/11/2008, 22h50
  2. Question sur les problèmes d'allocation dynamique
    Par slylafone dans le forum C++
    Réponses: 23
    Dernier message: 25/10/2004, 14h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo