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 :

Memory fault avec une structure


Sujet :

C

  1. #1
    Membre éclairé

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 641
    Par défaut Memory fault avec une structure
    Bonjour,

    Je débute en C. Je m'inspire du code proposé ici pour créer des classes me permettant de gérer facilement les sémaphores et segments de mémoire partagée.

    Fichier ipcobj.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct sIPCObject{
    	int iSemNbr;
    	int iSemId;
    };
     
    struct sIPCObject *sIPCObject_new(int, int);
    void sIPCObject_Delete(struct sIPCObject **this);
    int sIPCObject_getSemNbr(struct sIPCObject *this);
    void sIPCObject_CreateSem(struct sIPCObject *this);
    Fichier ipcobj.c :
    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
    #include <sys/sem.h>
    #include <sys/shm.h>
    #include <ipcobj.h>
     
    struct sIPCObject *sIPCObject_new(int iSemNbr, int iSemId) {
    	struct sIPCObject *p = (struct sIPCObject *)malloc (sizeof (struct sIPCObject));
    	if (!p)
    		return NULL;
    	p->iSemNbr = iSemNbr;
     
    	return p;
    }
     
    void sIPCObject_Delete(struct sIPCObject **this) {
    	if(*this)
    		free(*this);
     
    	*this = NULL;
    }
    Ensuite, je crée un objet sIPCObject avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct sIPCObject *myIPCObjet;
    int main(int argc, char *argv[]) {	
    myIPCObjet = sIPCObject_new(1, 1);
    sIPCObject_Delete(&myIPCObjet);
    L'affectation de la variable iSemNbr me provoque un Memory fault(coredump).

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Tu peux simplifier ton malloc ainsi (le cast n'est pas utile ici) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct sIPCObject *p = malloc (sizeof (*p));
    Par ailleurs, je trouve tous ces struct bien lourd, tu peux éviter cela en faisant un typedef sur ta structure soit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
    	int iSemNbr;
    	int iSemId;
    }
    sIPCObject;
    Maintenant tu n'a plus besoin d'utiliser le mot clé struct comme par exemple, ton malloc deviendrais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sIPCObject *p = malloc (sizeof (*p));
    Ton main n'est par ailleurs pas complet et ton code est vraiment illisible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(int argc, char *argv[])
    {
       struct sIPCObject *myIPCObjet = sIPCObject_new (1, 1);
       sIPCObject_Delete (&myIPCObjet);
     
       return 0;
    }
    Evite les globales comme tu viens de le faire !


    Une meilleure construction de ton constructeur serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct sIPCObject *sIPCObject_new (int iSemNbr, int iSemId)
    {
       struct sIPCObject *p = malloc (sizeof (*p));
     
       if (p != NULL)
       {
          p->iSemNbr = iSemNbr;
       }
     
       return p;
    }
    Plusieurs return dans une même fonction n'est pas très joli surtout si ca peut être évité facilement


    A part cela, je ne vois pas trop le problème, il ne devrait pas en avoir
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre éclairé

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 641
    Par défaut
    Merci. J'ai toujours un core dump avec la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int sIPCObject_getSemNbr(sIPCObject *this) {
    	int iSemNbr = 0;
    	if(this)
    		iSemNbr = this->iSemNbr;
     
    	return iSemNbr;
    }
    Appelée dans le main() avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int n = sIPCObject_getSemNbr(myIPCObjet);

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Il faudrait un code complet reduit au minimum et compilable pour que je puisse voir car là je ne vois pas du tout de quoi ca viens, tout me semble correct sauf si je suis passé à côté de quelque chose
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    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
    Citation Envoyé par Neuromancien2 Voir le message
    Merci. J'ai toujours un core dump avec la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int sIPCObject_getSemNbr(sIPCObject *this) {
    	int iSemNbr = 0;
    	if(this)
    		iSemNbr = this->iSemNbr;
     
    	return iSemNbr;
    }
    Appelée dans le main() avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int n = sIPCObject_getSemNbr(myIPCObjet);
    Ca ne devrait pas si la valeur de myIPCObjet est valide. Comment a-t-elle été initialisée ?

    Poste le code complet et compilable réduit au minimum qui produit ce problème. Il y a autre chose.

Discussions similaires

  1. probleme avec une structure.
    Par apesle dans le forum C
    Réponses: 5
    Dernier message: 24/12/2006, 15h18
  2. Utilisation de fichiers avec une structure
    Par showdown dans le forum C
    Réponses: 16
    Dernier message: 07/12/2006, 18h30
  3. Probleme avec une structure
    Par Fred2209 dans le forum C++Builder
    Réponses: 15
    Dernier message: 22/11/2006, 22h47
  4. probleme avec une "structure en arbre"
    Par kamouminator dans le forum C
    Réponses: 1
    Dernier message: 07/11/2006, 22h21
  5. Probléme avec une structure
    Par astragoth dans le forum C++
    Réponses: 3
    Dernier message: 25/04/2006, 20h31

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