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 :

Structure et pointeur


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut Structure et pointeur
    Salut,

    J'ai essayer de mettre en pratique la définition d'une structure avec pointeur mais ca bug
    voici une partie du code dans lequel je defini et initialise mes variables

    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
     
     
    typedef struct test{
            short    *outLtable;
            short    *outMtable;
            short    *outRtable;
            short    *outStable;
            double   *outDtable;
    } test;
     
    test *option ;
     
    if (option = malloc(sizeof(test)) == NULL) {
            perror("malloc failed");
            exit(EXIT_FAILURE);
    }
     
        option -> outDtable = NULL;
        option -> outLtable = NULL;
        option -> outMtable = NULL;
        option -> outRtable = NULL;
        option -> outStable = NULL;
    il me dit uhhandle exception

    pourtant il me semblait que c'est ainsi qu'il fallait initialiser. Le problem semble venir des lignes option -> outDtable = NULL; mais je ne comprens pas pourquoi.

    merci pour votre aide

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Eh bien je ne vois pas d'où peut venir l'erreur...

    Tu peux essayer avec sizeof(*option) au lieu de sizeof(test), mais je ne vois pas ce que ça changerait...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    En principe on met la définition de la structure hors des fonctions. Ensuite essaye avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    option = malloc(sizeof(test));
    if (option == NULL) {
            perror("malloc failed");
            exit(EXIT_FAILURE);
    }
    Chez moi ça passe très bien.

    Sinon, si malloc renvoit bien une valeur non nulle, il n'y aura aucun problème avec les assignations : option -> outDtable = NULL;

    [edit] en principe avec malloc, on force la valeur de retour avec (test*) dans ce cas. (enfin ici, il n'y a qu'une variable, il n'y aura pas de problème, mais si tu déclares un tableau comme ça, il faut mettre un cast (test*)

  4. #4
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par Nalido
    Salut,

    J'ai essayer de mettre en pratique la définition d'une structure avec pointeur mais ca bug
    voici une partie du code dans lequel je defini et initialise mes variables

    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
    
    typedef struct test{
            short    *outLtable;
            short    *outMtable;
            short    *outRtable;
            short    *outStable;
            double   *outDtable;
    } test;
    
    test *option ;
    
    /* if (option = malloc(sizeof(test)) == NULL) { */
    if ( (option = malloc(sizeof(*option)) ) == NULL) {
            perror("malloc failed");
            exit(EXIT_FAILURE);
    }
    
        option -> outDtable = NULL;
        option -> outLtable = NULL;
        option -> outMtable = NULL;
        option -> outRtable = NULL;
        option -> outStable = NULL;
    il me dit uhhandle exception

    pourtant il me semblait que c'est ainsi qu'il fallait initialiser. Le problem semble venir des lignes option -> outDtable = NULL; mais je ne comprens pas pourquoi.

    merci pour votre aide
    Warf !!

    Ce qui est affecté à option, ce n'est pas la valeur de pointeur vers la mémoire allouée dynamiquement mais le résultat de l'expression (malloc(sizeof(*option)) == NULL), donc 1 ou 0. Regardes bien les parenthèses manquantes plus haut. PB de priorité d'opérateur. Conséquence supplémentaire, la zone allouée est perdue, une belle fuite mémoire.

    Voilà donc une bonne raison pour ne pas mettre des affectations dans des expressions conditionnelles

    A+

  5. #5
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par Médinoc
    Eh bien je ne vois pas d'où peut venir l'erreur...

    Tu peux essayer avec sizeof(*option) au lieu de sizeof(test), mais je ne vois pas ce que ça changerait...
    C'est exactement le même problème que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*...*/
    int c;
    while (c = fgetc(truc) != EOF) { /*...*/ }
    /*...*/


    A+

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 64
    Par défaut
    merci
    ca fonctionne mieux comme ça!

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

Discussions similaires

  1. structures et pointeurs de fonctions
    Par aimad41 dans le forum C
    Réponses: 5
    Dernier message: 21/11/2006, 10h49
  2. Structures et pointeurs
    Par Tchetch dans le forum C
    Réponses: 14
    Dernier message: 19/10/2006, 13h30
  3. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  4. Structures et pointeurs
    Par mastochard dans le forum C
    Réponses: 17
    Dernier message: 25/05/2006, 11h55
  5. [structure et pointeur] problème d'affichage
    Par kitsune dans le forum C
    Réponses: 17
    Dernier message: 22/03/2006, 22h20

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