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 :

[linux]segfault lors d'un realloc d'une structure


Sujet :

C

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut [linux]segfault lors d'un realloc d'une structure
    salut à tous,

    je voudrais créer une "base de données" de tous les répertoires contenu dans mon répertoire. Dans ma base, je stocke le nom du répertoire, sa date en caractères, sa taille en caractères et son type en entier (main.h):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct
    {
      char filename[256];
      char filesize[7];
      char filedate[16];
      int filetype;
    } struct_file_type;
    Maintenant, je vais lister un à un les répertoireset réallouer la mémoire à chaque fois qu'un nouveau fichier est créer. J'initialise de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      struct_file_type *file_type, *new_file_type;
      int nb_elements;
     
      nb_elements=0;
      file_type=malloc(sizeof(*file_type));
    Noté que pour l'instant, il n'y a rien dedans.
    Maintenant je liste et teste si c'est un répertoire. Si oui je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      // c'est un repertoire
      nb_elements++;
      print_message_and_wait("Here");
      if ((new_file_type=realloc(file_type,nb_elements*sizeof(*new_file_type))) == NULL) {
        print_message_and_wait("ERREUR");
      }
      print_message_and_wait("OK");
      file_type=new_file_type;
    Alors la réallocation de la mémoire marche pour le premier dossier .. mais pas pour le second. J'ai bien le message Here qui s'affiche mais j'ai directement derrière un segfault, même pas le message ERREUR....

    Alors plusieurs idées me viennent à l'esprit :
    1) Dois-je désallouer file_type avant de faire file_type=new_file_type ?
    2) Dois-je faire une copie de mémoire après la réallocation, avant le file_type=new_file_type ??? (Je suppose que oui mais je voudrais qu'on me confirme).
    3) Dernier problème : D'où vient mon segfault ???

    Merci d'avance

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [linux]segfault lors d'un realloc d'une structure
    Citation Envoyé par le mage tophinus
    je voudrais créer une "base de données" de tous les répertoires contenu dans mon répertoire. Dans ma base, je stocke le nom du répertoire, sa date en caractères, sa taille en caractères et son type en entier (main.h):
    <...>
    Alors la réallocation de la mémoire marche pour le premier dossier .. mais pas pour le second. J'ai bien le message Here qui s'affiche mais j'ai directement derrière un segfault, même pas le message ERREUR....
    Ca me parait un peu tordu comme code.. Je ferais 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
     
    typedef struct
    {
       char filename[256];
       char filesize[7];
       char filedate[16];
       int filetype;
    }
    file_info_s;
     
     
    static void print_message_and_wait (char const *s)
    {
       printf ("%s\n", s);
       system ("pause");
    }
     
    int main (void)
    {
       int nb_elements;
       file_info_s *file_info = NULL;
     
       for (nb_elements = 1; nb_elements <= 5; nb_elements++)
       {
          void *tmp = realloc (file_info, nb_elements * sizeof (*file_info));
     
          if (tmp == NULL)
          {
             print_message_and_wait ("ERREUR");
             free (file_info), file_info = NULL;
             break;
          }
          else
          {
             file_info = tmp;
             print_message_and_wait ("OK");
          }
       }
     
       /* quand c'est fini ... */
     
       free (file_info), file_info = NULL;
     
       assert (file_info == NULL);
       return 0;
    }
    Dis nous si les erreurs persistent avec ça...

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut
    Merci beaucoup, grâce à ton code j'ai trouvé l'erreur. En gros, il fallait que je remplace le malloc(file_info) par l'attribution d'une valeur NULL à la déclaration de file_info.... Je comprends pas encore pouquoi il y avait un problème mais bon c'est résolu.

    Et encore un grand merci

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

Discussions similaires

  1. [Lazarus] [Linux] Erreur lors de la création d'une instance de classe héritée
    Par timmalos dans le forum Lazarus
    Réponses: 2
    Dernier message: 10/05/2011, 12h59
  2. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 14h08
  3. [ADO] Probleme lors de l'execution d'une requete...
    Par NoisetteProd dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/06/2004, 12h43
  4. Problème lors d'un Update sur une date
    Par Nany dans le forum ASP
    Réponses: 3
    Dernier message: 19/05/2004, 22h37
  5. message d'erreur lors de la création d'une base
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/04/2004, 15h47

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