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 :

Malloc sur un pointeur élément d'une structure


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Malloc sur un pointeur élément d'une structure
    Hello,

    Soit la structure suivante :
    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
     
    typedef struc maStructure
    {
        float* array;
    } maStructure;
     
    maStructure*data = NULL;
     
    void uneFonction()
    {
        data = (maStructure*)malloc(sizeof(maStructure));
        data->array = (float*)malloc(10*sizeof(float));
    }
     
    void uneAutreFonction()
    {
     	if (data)
    	{
    		if (data->inputs)
    			free(data->inputs);
    		free(data);
    	}
    }
     
    void main()
    {
        uneFonction();
        uneAutreFonction();
    }
    L'instruction fait planter mon programme. Pourquoi ?
    J'ai évidemment fait des simplifications de code...

    Merci pour vote aide.

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    As tu vérifié que l'allocation s'etait bien passé (retour != NULL)?
    As tu verfié que tu ne dessallouais pas deux fois ta mémoire (ça peux arriver en multithread)?
    car si tu fais un free sur une mémoire que tu n'as pas alloué ou que tu as déjà desaloué cela fait un memory fault.


    Autrement en reprenant ton exemple je ne reproduis pas ton problème

    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef struct
    {
      float* array;
    } maStructure;
     
    maStructure*data = NULL;
     
    void uneFonction()
    {
      printf("Allocation de data\n");
        data = (maStructure*)malloc(sizeof(maStructure));
      printf("Allocation de data -> array\n");
        data->array = (float*)malloc(10*sizeof(float));
    }
     
    void uneAutreFonction()
    {
      printf("free data->array\n");
      free(data->array);
      printf("free data\n");
      free(data);
    }
     
    int main()
    {
        uneFonction();
        uneAutreFonction();
        printf("C'est la fin\n");
        return 0;
    }

    j'ai
    $ gcc toto.cpp

    $ ./a.exe
    Allocation de data
    Allocation de data -> array
    free data->array
    free data
    C'est la fin

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    J'ai rajouté le code pour les vérifs. Comme je faisais un traitement sur les structures de données, je savais qu'elles étaient à louer, mais bon.. Je l'ai finalement rajouté par soucis de rigueur.
    Sinon, je ne fais pas de multithread.

    Si ça fonctionne chez toi, le problème doit être dans ce que j'ai viré par soucis de simplification.

    Comme ça faisait 10 ans que je ne faisais plus de C, je n'étais pas sûr de mon coup sur la syntaxe et le séquencement. Je vais revoir mes autres parties de code...

    Merci. Je vous tiens au coruant !

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Je suggère un petit ajout à cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void uneAutreFonction()
    {
     	if (data)
    	{
    		if (data->array)
    			free(data->array);
    		free(data);
    		data = NULL;
    	}
    }
    Sans cette instruction supplémentaire, deux appels à uneAutreFonction pouvaient faire planter l'appli.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/08/2011, 17h43
  2. Pointeur sur les éléments d'une structure
    Par Marley_T dans le forum C
    Réponses: 16
    Dernier message: 05/05/2008, 23h31
  3. pointer sur un autre élément d'une liste en codage
    Par rahan_dave dans le forum Access
    Réponses: 3
    Dernier message: 03/02/2006, 13h25
  4. Réponses: 1
    Dernier message: 26/10/2005, 09h15
  5. Réponses: 2
    Dernier message: 11/01/2005, 14h10

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