Partage
  • Partager sur Facebook
  • Partager sur Twitter

Segmentation fault dans un petit programme

    16 février 2017 à 1:15:20

    Bonsoir

    est ce que vous pouvez me dire pourquoi mon programme donne une erreur de segmentation.

    #include<stdio.h>
    #include<stdlib.h>
    
    struct Coordonnees{
      int x;
      int y;
    
    };
    
    void tripler(struct Coordonnees *point)
    {
    
      point->x=3*point->x;
      point->y=3*point->y;
    
    }
    
    
    
    
    int main()
    {
    
      struct Coordonnees *point=NULL;
      point->x=10;
      point->y=20;
      tripler(point);
      printf("X est : %d\n",point->x);
      return 0;
    }
    
    

    Je vous remercie par avance

    • Partager sur Facebook
    • Partager sur Twitter
      16 février 2017 à 1:19:24

      Bonsoir,

      Parce que ligne 25 un pointeur nul est déréférencé.

      • Partager sur Facebook
      • Partager sur Twitter
        16 février 2017 à 1:24:08

        Merci de votre réponse, pourquoi un pointeur nul ? du cous la je fais comment pour que ca marche ?

        pour moi j'ai crée un pointeur de type coordonnees que j'ai nommé point puis j'initialise ses champs a 10 et 20 puis je veux tripler ses champs.

        • Partager sur Facebook
        • Partager sur Twitter
          16 février 2017 à 1:37:27

          Salut,

          NULL, c'est pour dire "rien", "nulle-part".

          Si ton pointeur vaut NULL, où crois tu que va te mener NULL->x ? à un x contenu nulle-part ?

          • Partager sur Facebook
          • Partager sur Twitter

          Bonhomme !! | Jeu de plateforme : Prototype.

            16 février 2017 à 1:41:04

            je suis d'accord mais dans les deux ligne qui suivent j'ai donné la valeur de 10 et 20 a x et y, du coups il est pas nul la.
            • Partager sur Facebook
            • Partager sur Twitter
              16 février 2017 à 1:52:12

              Tu n'as rien mis du tout puisque ça seg fault.

              Tes lignes 25 et 26 c'est :

              mettre 10 dans la variable x de la structure Coordonnees stockée NULLe part.

              mettre 20 dans la variable y de la structure Coordonnees stockée NULLe part.

              Si je te demande de livrer une pizza dans la première maison d'une rue qui est nulle-part, tu l'emmène où ta pizza ?

              • Partager sur Facebook
              • Partager sur Twitter

              Bonhomme !! | Jeu de plateforme : Prototype.

                16 février 2017 à 2:22:50

                Salut, il faut que tu alloues un espace mémoire pour ta variable avant de faire des affectations.

                -
                Edité par xUnkn0W-Us3rx 16 février 2017 à 2:24:28

                • Partager sur Facebook
                • Partager sur Twitter
                  16 février 2017 à 7:44:02

                  #include<stdio.h>
                  
                  struct Coordonnees {
                    int x;
                    int y;
                  };
                  
                  void tripler(struct Coordonnees *point)
                  {
                    point->x *= 3;
                    point->y *= 3;
                  }
                  
                  int main(void)
                  {
                    // Tu declares une structure
                    struct Coordonnees point;
                  
                    //Tu affectes des valeurs
                    point.x = 10;
                    point.y = 20;
                  
                    //Tu appelles ta fonction en transmettant l'ADRESSE de ta structure
                    tripler( &point );
                  
                    //Tu affiches le resultat
                    printf("X = %d, Y = %d\n", point.x, point.y);
                  
                    return 0;
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 février 2017 à 7:50:55

                    je suis d'accord mais dans les deux ligne qui suivent j'ai donné la valeur de 10 et 20 a x et y, du coups il est pas nul la.

                    Attention, tu confonds une variable (destinée à contenir une donnée) et un pointeur (destiné à contenir une adresse)(*).

                    10 et 20 sont des données. Tu as voulu les stocker dans une variable. Dans quelle variable ? Celle pointée par le pointeur. Problème : ce pointeur ne pointe pour l'instant sur aucune variable. Comme le dit drx, c'est comme si tu voulais livrer des pizzas (les données) sans avoir l'adresse du client (le pointeur sur la variable).

                    Je pense que la confusion vient de l'initialisation du pointeur à NULL : elle ressemble à l'initialisation d'une variable à zéro, or ce n'est pas du tout la même chose. D'ailleurs je ne vois pas l'intérêt d'initialiser un pointeur à NULL. Ce serait moi (mais je n'ai pas assez d'expérience pour en juger), une telle initialisation serait rigoureusement proscrite. Une solution qui me paraît plus pratique est d'écrire une fonction 'initialiser' qui fait ce qu'a dit xUnkn0W-Us3rx : elle alloue un emplacement mémoire pour une variable dynamique contenant les données 10 et 20 (par exemple), et ensuite on fait pointer le pointeur sur cette variable.

                    Ainsi, la déclaration/initialisation du pointeur serait :

                    struct Coordonnees *point=initialiser(10, 20);
                    

                    Bien sûr, il ne faudra pas oublier de désallouer l'emplacement mémoire à la fin.

                    (Ah, je viens de voir la solution de magma, qui est effectivement bien plus simple !)


                    (*) Je passe sous silence le fait qu'une adresse peut être considérée dans certains cas comme une donnée, ça ne ferait qu'embrouiller.

                    -
                    Edité par robun 16 février 2017 à 7:55:17

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 février 2017 à 8:35:21

                      robun a écrit:

                      (*) Je passe sous silence le fait qu'une adresse peut être considérée dans certains cas comme une donnée, ça ne ferait qu'embrouiller.

                      -
                      Edité par robun il y a 39 minutes

                      Il vient de commencer, ça serai dommage de le dégouter si tôt :/

                      • Partager sur Facebook
                      • Partager sur Twitter

                      « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
                      D. Mendeleïev

                        16 février 2017 à 14:33:19

                        bime009 a écrit:

                        Merci de votre réponse, pourquoi un pointeur nul ? du cous la je fais comment pour que ca marche ?

                        pour moi j'ai crée un pointeur de type coordonnees que j'ai nommé point puis j'initialise ses champs a 10 et 20 puis je veux tripler ses champs.

                        Attention, tu crées un pointeur de type pointeur de struct Coordonnees (et pas simplement de type struct Coordonnees), que tu as nommé point.
                        Ensuite, tu n'initialises pas les champs du pointeur, puisque s'agissant d'un type scalaire, il n'a pas de champ. Ce que tu essaies d'affecter (et pas d'initialiser, car après la déclaration c'est trop tard), ce sont des champs de la structure pointée par ce pointeur. Mais il n'existe pas de telle structure, et le pointeur pointe nulle part. D'où la segfault.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 février 2017 à 1:04:11

                          Merci tout le monde pour vos réponse, j'ai compris, je vous souhaite une bonne soirée
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Segmentation fault dans un petit programme

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown