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

Langage C++ Discussion :

Structures, pointeur et segmentation fault


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 1
    Par défaut Structures, pointeur et segmentation fault
    Bonjoru,

    j'ai un problème de segmentation fault avec le code ci-dessous :

    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
     
    #include <stdio.h>
     
    typedef struct {
        int data;
    } st_toto;
     
    typedef struct
    {
        int data;
        st_toto *toto_ptr;
    } st_tata;
     
    int main()
    {
        st_tata tata;
     
        tata.data = 123;
        tata.toto_ptr->data = 456;
     
        printf("tata data = %d\n", tata.data); 
        printf("toto data = %d\n", tata.toto_ptr->data); 
     
        return 0;
    }
    visiblement le problème vient du pointer qui pointe vers la première structure
    quelqu'un pour m'aider ?

    Merci

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Deux questions afin d'évaluer ton niveau de connaissance : à quoi t'attendais-tu ? Que penses-tu qu'il se produise à l'exécution de ce programme ?

  3. #3
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour,
    Citation Envoyé par pierre_92 Voir le message
    Bonjoru,

    j'ai un problème de segmentation fault avec le code ci-dessous :
    visiblement le problème vient du pointer qui pointe vers la première structure
    quelqu'un pour m'aider ?

    Merci
    Effectivement, l'erreur vient de votre pointeur, vous n'avez pas alloué de la mémoire pour pouvoir stocker la valeur 456. Ce que vous avez fait en réalité, c'est que vous avez d'attribuer la valeur 456 comme l'adresse de que quelque chose au pointeur et lors de l'affichage vous lui demande d'afficher ce qui se trouve à cette adresse (ici en l'occurrence 456) donc segment.....
    Le mieux est de faire une allocation, mais attention après utilisation, il faut rendre la mémoire au système en appelant delete
    Code c++ : 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
     
    #include <cstdlib>
    #include <iostream>
     
    typedef struct {
        int data;
    } st_toto;
     
    typedef struct{
        int data;
        st_toto *toto_ptr;
    } st_tata;
     
    int main( void ){
     
        int r = 0;
        st_tata x;
        x.data = 100;
        x.toto_ptr = new st_toto;
        x.toto_ptr->data = 100;
     
        r = x.data + x.toto_ptr->data;
        std::cout << "st_data.data\t:" << x.data << std::endl;
        std::cout << "st_data.st_toto->data\t:" << x.toto_ptr->data << std::endl;
        std::cout << "Resultat\t:" << r << std::endl;
     
        delete x.toto_ptr;
     
        return EXIT_SUCCESS;
    }
    à bientôt

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Y'a-t-il une raison à ce que toto_ptr soit un pointeur ?
    Si oui, il conviendrait de l'initialiser à nullptr. Et de l'initialiser correctement avec un objet existant avant de l'utiliser.
    Si ton initialisation revient à faire un new puis un delete, il n'a pas à être un pointeur mais devrait être un simple membre. Donc l'utilisation de std::unique_ptr n'est pas non plus bienvenue ici.

    Enfin ce code est du pur C. Es-tu vraiment en C++ ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2017, 13h00
  2. Pointeurs et segmentation fault
    Par Jichaels dans le forum Débuter
    Réponses: 4
    Dernier message: 15/10/2016, 23h21
  3. segmentation.fault pointeur ->de.*m.
    Par PhilippeHen dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2009, 16h51
  4. Réponses: 3
    Dernier message: 21/01/2008, 14h38
  5. Réponses: 6
    Dernier message: 01/11/2007, 18h44

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