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 :

Pb d'allocation dynamique avec malloc


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Points : 39
    Points
    39
    Par défaut Pb d'allocation dynamique avec malloc
    Bon voila je travaille avec une file de type 'fifo' composée de structures 'cellule'. Pour enfiler une cellule dans la file, j'utilise la fonction 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
    fifo* fifo_enfiler(fifo* file, char* element, int num){
    	if(element!=NULL)
    	{
    		cellule* nouveau=NULL;
    		nouveau = cellule_init(nouveau);
    		/*DEBUG*/
    		printf("nouveau : %d\n",nouveau);
    		strcpy(nouveau->string,element);
    		nouveau->num_ligne = num;
     
    		if(vide(file))
    			file->tete = file->queue = nouveau;
    		else
    		{
    			file->queue->suivant = nouveau;
     
    			cellule* temp = file->queue->suivant;
    			file->queue = temp;
    		}
     
    		nouveau=NULL;
     
    		return file;
    	}
    	else return NULL;
    }
    J'appelle cette fonction deux fois consécutivement sue deux files différentes. Et la, comportement très bizarre, la ligne de DEBUG montre que la fonction me retourne deux fois le meme pointeur !

    Je suis un peu a court d'idée après avoir passé mon week-end dessus, qq1 aurait une idée ?
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Pb d'allocation dynamique avec malloc
    Citation Envoyé par Magicmax
    Bon voila je travaille avec une file de type 'fifo' composée de structures 'cellule'. Pour enfiler une cellule dans la file, j'utilise la fonction suivante :
    Ce serait bien d'avoir le code compilable...

    Ton code est inutilement compliqué. Il n'est pas utile de passer un paramètre si on le modifie derrière.

    Ceci fonctionne :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct cellule
    {
       /* link */
       struct cellule *suivant;
     
       /* data */
       char string[123];
       int num_ligne;
    }
    cellule;
     
    typedef struct
    {
       cellule *tete;
       cellule *queue;
    }
    fifo;
     
    static cellule* cellule_init(void)
    {
       cellule* nouveau = malloc(sizeof * nouveau);
     
       if (nouveau != NULL)
       {
          static cellule z =
             {
                0
             };
       }
       return nouveau;
    }
     
    static int vide(fifo* file)
    {
       return file->tete == NULL;
    }
     
    void fifo_enfiler(fifo* file, char* element, int num)
    {
       if (element != NULL)
       {
          cellule* nouveau = cellule_init();
     
          if (nouveau != NULL)
          {
             /*DEBUG*/
             printf("nouveau : %p\n", (void*) nouveau);
             strcpy(nouveau->string, element);
             nouveau->num_ligne = num;
     
             if (vide(file))
             {
                file->tete = file->queue = nouveau;
             }
             else
             {
                file->queue->suivant = nouveau;
     
                cellule* temp = file->queue->suivant;
                file->queue = temp;
             }
     
             nouveau = NULL;
          }
       }
    }
     
    int main (void)
    {
       /* premiere */
       fifo file =
          {
             0
          } ;
     
       fifo_enfiler (&file, "abc", 123);
       fifo_enfiler (&file, "def", 456);
       return 0;
    }
    Evidemment, la mémoire n'est pas libérée...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    voila la fonction d'initialisation d'une cellule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cellule* cellule_init(cellule* cell){
    	cell=(cellule*)malloc(sizeof(cellule));
    	cell->string=(char*)malloc(MAX_CHAR_LIGNE*sizeof(char));
    	cell->suivant=NULL;
     
    	return cell;
    }
    et voila l'appel que je réalise dans une autre fonction :
    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
     
    /*ajout des lignes lues dans les buffers de fichiers*/
    if(temp_source!=NULL)
    {
    	if(!feof(fich_source))
    	{
    		/*DEBUG*/
    		printf("%s enfile dans source\n",temp_source);
    		source->buffer=fifo_enfiler(source->buffer, temp_source, n_ligne);
    	}
    }
    else
    	flag_fich_source_vide=1;
     
    if(temp_dest!=NULL)
    {
    	if(!feof(fich_dest))
    	{
    		/*DEBUG*/
    		printf("%s enfile dans dest\n",temp_dest);
    		dest->buffer=fifo_enfiler(dest->buffer, temp_dest,n_ligne);
    	}
    }
    else
    	flag_fich_dest_vide=1;

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Magicmax
    voila la fonction d'initialisation d'une cellule :
    C'est le mot 'compilable' que tu ne comprends pas ?
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    effectivement je n'avais pas compris ce que tu entendais exactement par la...

    Je vais tester ta solution en tout cas, merci de répondre si vite.

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    j'avais en plus une autre erreur dans mon code, en tout cas merci de m'avoir donné de quoi optimiser et surtout de quoi occuper ma nuit

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

Discussions similaires

  1. allocation dynamique avec double pointeur ou non
    Par Blackbull dans le forum C
    Réponses: 6
    Dernier message: 09/12/2012, 00h53
  2. Allocation Dynamique de Memoire Avec Operateur New
    Par msstaf dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/06/2006, 15h49
  3. Membres statics avec allocation dynamique
    Par b Oo dans le forum C++
    Réponses: 4
    Dernier message: 07/05/2006, 17h13
  4. Réponses: 9
    Dernier message: 22/12/2005, 22h20
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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