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 :

free() qui provoque une segmentation fault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 125
    Par défaut free() qui provoque une segmentation fault
    bonjour a tous,

    j'ai une fonction free qui provoque une segmentation fault.
    Qu'en pensez vous ?
    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
    typedef struct S_BufferTile
    {
        SDL_Surface *image;
        enum tiles tileSymbol;
    }S_BufferTile;
     
    typedef struct S_BoxTile
    {
      S_BufferTile box;
      int xBoxPos;
      int yBoxPos;
      int state;
    }S_BoxTile;
     
    int main()
    {
       S_BoxTile *boxes;/*localisation des caisses dans le plateau*/
       boxes=initBox();/*cree un tableau de caisses*/
    ....
       freeBoxes(boxes);
    ...
     return EXIT_SUCCESS;
    }
     
    S_BoxTile* initBox(void)
    {
      /*initialisation des caisses du jeux*/
      S_BoxTile *boxes=(S_BoxTile*)malloc(MAX_BOX_LEVEL*sizeof(S_BoxTile));
     
      int i;
      for (i=0; i<MAX_BOX_LEVEL; i++)
        {
          boxes[i].box.image=NULL;
          boxes[i].box.tileSymbol=0;
          boxes[i].xBoxPos=0;
          boxes[i].yBoxPos=0;
        }
      return boxes;
     
    void freeBoxes(S_BoxTile *boxes)
    {
      /*libere les ressources allouee aux boites*/
      printf("boxes dans freeboxes=%p\n",boxes);
      free(boxes);
      boxes=NULL;
    }
    je ne comprends pas le pourquoi.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    En général, un free() qui provoque un plantage a 2 causes possibles :
    • Le double free(). Tu libères 2 fois le même bloc de mémoire.
    • Le bloc alloué est corrompu par le programme quand tu vas écrire plus loin que la taille demandée et en général, cela corromp un pointeur (et pas forcémment le pointeur courant).

    La correction de ce problème demande de remonter les manches et de tracer toutes les allocations/libérations ainsi que les lectures/écritures dans les blocs alloués.

    Il y a aussi des outils pour aider au débuggage (Valgrind ?)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 125
    Par défaut
    merci de ta reponse ram-0000

    lors du segment fault, j'ai remarquer ceci dans la console :

    boxes avant liberation=0x8d43750
    boxes dans freeboxes=0x8d43750
    *** glibc detected *** ./sokoban: munmap_chunk(): invalid pointer: 0x08d43750 ***

    la memoire alloue me renvoie 0x8d43750
    glibc detected : 0x08d43750 pourquoi 0x<0>8d...

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par bringer Voir le message
    la memoire alloue me renvoie 0x8d43750
    glibc detected : 0x08d43750 pourquoi 0x<0>8d...
    Si ton problème c'est le 0 supplémentaire affiché par glibc, ce n'est pas un problème. Toi tu fais un affichage sur 7 octets (0x8d43750), glibc préfère un affichage sur 8 octets (0x08d43750) en rajoutant un 0 supplémentaire devant (ce que je préfère aussi).

    Ce n'est absolumment pas la cause de ton problème.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre confirmé Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 125
    Par défaut
    merci ram-0000

    l'erreur était effectivement due à une autre allocation dans une autre fonction.
    J'avais fait l'erreur de créer un tableau de structure avec une variable numérique au lieu d'une constante. Quand j'ai créer la constante pour plus de facilite, sur la ligne de l'allocation du tableau, j'ai laisser valeur numérique (3) au lieu de la remplacer par ma constante créé (#define MAX_TILE 5).

    du coup, lors du parcours du tableau, je séquençais sur 5 blocs structures mais je n'en avais alloué que 3, d'où segmentation fault.

    merci encore.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    void freeBoxes(S_BoxTile *boxes)
    {
    /*libere les ressources allouee aux boites*/
    printf("boxes dans freeboxes=%p\n",boxes);
    free(boxes);
    boxes=NULL;
    }
    Tu ne modifies ici que le pointeur local. Une fois que tu sors de la fonction, ton pointeur d'origine pointe toujours au même endroit qu'auparavant, ce qui est un bug.

Discussions similaires

  1. [PHP 5.4] DateTime qui provoque une erreur 500 (incompréhensible)
    Par jb_gfx dans le forum Langage
    Réponses: 5
    Dernier message: 02/06/2013, 00h34
  2. Réponses: 2
    Dernier message: 18/03/2008, 13h58
  3. [C# 2.0] Un Convert.ToDouble qui semble provoque une exception.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/05/2006, 16h51
  4. Syscall signal provoque un segmentation fault
    Par breezer911 dans le forum Administration système
    Réponses: 2
    Dernier message: 24/04/2006, 13h40
  5. Réponses: 6
    Dernier message: 13/11/2005, 12h11

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