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 :

Libérez correctement un tableau de structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 3
    Points : 7
    Points
    7
    Par défaut Libérez correctement un tableau de structure
    Bonjour/Bonsoir,

    J'ai la structure suivante avec laquelle je travaille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct polynome_s
    {
    	double *coeffs; //Tableau des coefficients
    	int deg;  //Degre du polynome
    }Polynome;
    Je l'alloue avec la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Polynome *AllocPolynome (int deg)
    //On alloue de la mémoire pour la structure et son tableau en fonction du degr passé en paramétre
    {
    	Polynome *alloc;
    	alloc = malloc(sizeof(Polynome));
    	alloc->deg = deg-1;
    	alloc->coeffs = malloc(deg*sizeof(double));
    	return alloc;
    }
    Je récupére donc alloc dans une variable Polynome poly1 et pour libérer cette structure j'ai la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void FreePolynome(Polynome *P)
    //On libére
    {
    	free(P->coeffs);
    	free(P);
    }
    Que j'appelle comme ça:
    Cependant, j'ai un problème lors de l'éxecution du programme, le compilateur me dit :

    *** Error in `./a.out': free(): invalid next size (fast): 0x000000000225c0a0 ***
    Abandon (core dumped)

    Du coup je pense raisonnablement que ça vient d'un problème dans ma fonction FreePolynome, mais je vois pas ou.
    Un peu d'aide me serait utile

    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    La fonction FreePolynome() fait son travail exactement, elle n'est pas en cause (il manque peut-être un test vérifiant que les 2 pointeurs ne sont pas NULL.)
    Un free qui se passe mal, peut être dû entre autres à :
    • le pointeur passé n'a jamais été alloué
    • le pointeur a déjà été libéré
    • la donnée pointée a été altérée par une mauvaise utilisation.


    Je pense ici au troisième cas.
    L'allocation pour un polynôme par exemple de degré 2, ne semble réserver qu'1 ou 2 éléments (deg-1), il me semble que 3 éléments sont nécessaires.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 3
    Points : 7
    Points
    7
    Par défaut
    En fait je crée une chaîne de caractère à partir d'une chaîne de caractère sous cette forme : " 1 2 3", cette chaîne contient 3 espaces et donc je fais deg-1 pour dire que c'est un polynôme de degré 2, puis j'alloue en fonction de deg pour réserver 3 cases pour mes coefficients.
    Je remplie ma structure comme ça :
    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
    Polynome * InitPolynome (const char *str)
    //On compte nombre d'espace dans la chaine pour créer une chaine qui va contenir la position des espaces dans la chaine. On enverra le nombre d'espace de la chaine en paramétre de la fonction *AllocPolynome
    //la fonction atof() s'arrête au premier espace rencontré et prend en paramétre un pointeur. On s'en sert pour stocker les nombre à partir de la position des espaces contenus dans le tableau place.
    {
    	Polynome *init;
    	int espace=0, i,j=0;
     
    	for(i=0;i<strlen(str);i++)
    	{
    		if(str[i] == ' ')
    			espace++;
    	}
     
    	printf("%d\n", espace);
    	int *place = malloc(sizeof(int)*espace);
    	for(i=0;i<strlen(str);i++)
    	{
    		if(str[i] == ' ')
    		{
    			place[j] = i+1;
    			j++;
    		}
    	}
     
    	init = AllocPolynome(espace);
    	init->coeffs[0] = atof(&str[0]);
    	for(i=1;i<espace;i++)
    		init->coeffs[i] = atof(&str[place[i]]);
    	free(place);
    	return init;
    }

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Le nom 'deg' à l'entrée de la fonction m'a trompé.
    Je ne vois pas de dépassement dans le code, néanmoins l'erreur indiquée à des chances de correspondre à un des trois cas que j'ai cité.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 3
    Points : 7
    Points
    7
    Par défaut
    C'est bon, j'ai trouvé mon erreur. En fait c'était juste parce que derrière je créais une deuxième chaine de caractères mais d'une manière différente et je me suis planté dans la façon d'envoyer cette chaine un peu différente dans mon fonction InitPolynome. Maintenant mon programme marche comme je veux et sans bug !
    Merci pour votre aide, ça m'a aidé à repérer la faute !

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kalixio Voir le message
    Code c : 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
    	for(i=0;i<strlen(str);i++)
    	{
    		if(str[i] == ' ')
    			espace++;
    	}
     
    	printf("%d\n", espace);
    	int *place = malloc(sizeof(int)*espace);
    	for(i=0;i<strlen(str);i++)
    	{
    		if(str[i] == ' ')
    		{
    			place[j] = i+1;
    			j++;
    		}
    	}
    }
    ...
    free(place);
    Maintenant mon programme marche comme je veux et sans bug
    Bonjour

    Sans bug c'est probable. Sans imperfections ça l'est moins...

    Par exemple ce type de boucle est assez maladroit car ça va appeler strlen() à chaque itération. Vaudra mieux alors l'appeler qu'une fois et mémoriser son résultat puis utliser ce résultat dans la boucle. Ou alors faire partir "i" de strlen() et descendre jusqu'à 0. Ou bien plus simplement tester str[i] différent de '\0'...

    Code c : 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
    	for(i=0; i<str[i] != '\0'; i++)
    	{
    		if(str[i] == ' ')
    			espace++;
    	}
     
    	printf("%d\n", espace);
    	int *place = malloc(sizeof(int)*espace);
    	for(i=0; i<str[i] != '\0'; i++)
    	{
    		if(str[i] == ' ')
    		{
    			place[j] = i+1;
    			j++;
    		}
    	}
    }
    ...
    free(place);

    Bon on peut se dire que l'appel à str[i] est lui-aussi générateur de travail (aller au début de "str" puis décaler de "i" octets). Généralement pour une chaine ce travail n'est pas gênant mais si ça te gêne quand-même, alors tu peux passer par un pointeur...
    Code c : 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
    	char *pt
    	for(pt=str; *pt != '\0'; pt++)
    	{
    		if(*pt == ' ')
    			espace++;
    	}
     
    	printf("%d\n", espace);
    	int *place = malloc(sizeof(int)*espace);
    	for(pt=str, i=1; *pt != '\0'; pt++, i++)
    	{
    		if(*pt == ' ')
    		{
    			place[j] = i;
    			j++;
    		}
    	}
    }
    ...
    free(place);

    Et sinon, dernier détail, tu as la fonction isspace(c) qui détecte si "c" fait partie des caractères assimilés à l'espace (dont la tabulation). Mais dans tous les cas, ce code ne fonctionnera malheureusement pas s'il y a plus d'un espace entre 2 éléments de ton polygône...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/05/2006, 11h46
  2. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00
  3. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 08h02
  4. Réponses: 9
    Dernier message: 13/02/2006, 08h39
  5. Trier un tableau de structures
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 05/11/2005, 17h28

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