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 :

Probleme de realloc d'un pointeur de pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Par défaut Probleme de realloc d'un pointeur de pointeur
    Bonjour j'ai actuellement une erreur de segmentation lorsque je fais un realloc sur une de mes structures, pourtant je cree bien cette structure dynamiquement avec un malloc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    TypVoisins **lstCC = (TypVoisins **) malloc(tailleMax * sizeof(TypVoisins*));
    ensuite je fais des realloc au cours de l'execution du programme et des le premier j'ai un 'segmentation fault' pourtant je ne vois pas pourquoi ça coince

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    lstCC = (TypVoisins **)realloc(lstCC, (sizeof(lstCC)+1) * sizeof(TypVoisins *));
    ps : je sais que le cast sur un realloc n'est pas recommandé mais meme sans le cast ça ne passe pas

    Est ce que quelqu'un voit d'ou sa peut venir?

    merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstCC = (TypVoisins **)realloc(lstCC, (sizeof(lstCC)+1) * sizeof(TypVoisins *));
    « lstCC » est un pointeur. « sizeof (lstCC) » vaut donc 4 sur une machine 32 bits, quelque soit la taille allouée de la zone mémoire qu'il pointe.

  3. #3
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstCC = (TypVoisins **)realloc(lstCC, (sizeof(lstCC)+1) * sizeof(TypVoisins *));
    Je ne comprends pas ce que tu cherches à faire ici. Tu veux allouer une taille de mémoire correspondant à la taille d'un pointeur, incrémentée de 1, multipliée par la taille d'un autre pointeur, ce qui fait (4+1)*4. Quelle en est la signification ?

    Deuxièmement, ce code est susceptible de provoquer une fuite de mémoire. Il faut stocker le retour de realloc dans un pointeur temporaire, car si la fonction échoue, elle renvoie NULL. Or, là, tu écrases lstCC directement, sans chercher à savoir si realloc a réussi ou non. Si la fonction ne renvoie pas NULL, c'est qu'elle n'a pas échoué ; là, tu peux alors écraser l'ancienne valeur.

    Le cast void* vers type_quelconque*, et vice versa, est implicite en C. Cela ne sert donc à rien de caster.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstCC = (TypVoisins **)realloc(lstCC, (sizeof(lstCC)+1) * sizeof(TypVoisins *));
    Je ne comprends pas ce que tu cherches à faire ici. Tu veux allouer une taille de mémoire correspondant à la taille d'un pointeur, incrémentée de 1, multipliée par la taille d'un autre pointeur, ce qui fait (4+1)*4. Quelle en est la signification ?
    Je pense qu'il veut agrandir la zone mémoire qu'il a initialement alloué et qu'il pense qu'un sizeof() sur le pointeur qui pointe cette zone lui renverra sa taille.

  5. #5
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Par défaut
    effectivement je pensais que le sizeof me renvoyait la taille de la zone memoire et le probleme venait effectivement de la...merci

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    De rien, mais n'oublie pas

  7. #7
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Par défaut
    j'aurais juste une autre question... en fait lorsque je fais appel a une fonction ,qui est dans le meme fichier que la fonction appelante, si la fonction appelée n'est pas ecrite avant la fonction appelante j'ai un warning et je suis obligé de mettre la fonction appelée dans un .h est ce normal?

Discussions similaires

  1. Pointeurs et pointeurs de pointeurs
    Par wallace27 dans le forum C
    Réponses: 10
    Dernier message: 09/04/2015, 22h07
  2. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  3. Réponses: 6
    Dernier message: 26/05/2007, 00h33
  4. Réponses: 2
    Dernier message: 11/04/2007, 22h34
  5. Réponses: 18
    Dernier message: 29/03/2007, 20h40

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