Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur de segmentation...

...Avec un pointeur de tableau

Sujet résolu
    29 juillet 2007 à 20:07:35

    Bonjour tout le monde :) .

    Comme le dit mon titre j'ai fait un programme pour m'entraîner sur les pointeurs de tableaux. Mo programme est censé demander à l'utilisateur de rentrer des valeurs dans un tableau à 10 cases. Je n'utilise pas un simple tableau je passe par un pointeur de tableau (pointeur de pointeur, quoi). Ensuite, je créer un autre pointeur de tableau. Ses cases prendront les valeurs du premier tableau.

    Voilà le code:

    #include <iostream>

    using namespace std;

    int main(int argc, char *argv[])
    {
            int **tableau;
           
            *tableau = new int[10];
           
            for(int i=0;i<10;i++)
            {
                    cout << "Pour " << i << ": ";
                    cin >> (*tableau)[i];
                    cout << (*tableau)[i] << endl;
            }
           
            int **tableaub;
           
            *tableaub = new int[10];
           
            for(int i=0;i<10;i++)
            {
                    (*tableaub)[i] = (*tableau)[i];
                    cout << (*tableaub)[i] << endl;
            }
           
            int pause;
            cout << "Appuyez sur entrée pour finir" << endl;
            cin >> pause;
           
            delete *tableau;
            delete *tableaub;
           
            return 0;
    }


    Puis voilà les explications:

    Lignes 5-7: Création du premier pointeur de tableau. Le tableau a 10 cases.

    Lignes 9-14: On demande à l'utilisateur d'entrer une valeur pour chaque case.

    Lignes 16-18: Création du second pointeur de tableau.

    Lignes 20-24: On copie les données de tableau à tableaub.

    Lignes 26-31: C'est la fin, on attend que l'utilisateur appuie sur une touche avant de libérer la mémoire.

    Seulement, le programme s'arrête arrivé à "*tableaub = new int[10];" et a pour seul argument "erreur de segmentation(core dumped)".

    Moi, je ne vois pas où est ce que je demande au programme d'aller chercher trop loin...

    Merci d'avance pour votre aide ;)
    • Partager sur Facebook
    • Partager sur Twitter
      29 juillet 2007 à 21:28:16

      Citation

      Moi, je ne vois pas où est ce que je demande au programme d'aller chercher trop loin...


      En manipulant les pointeurs, une erreur peut engendrer à peu près n'importe quoi, attention donc à ne pas d'établir de conclusion trop attive ;)

      int **tableau;
      *tableau = new int[10];

      Ce code pourrait être comparable à ça :
      int *i;
      *i=5;

      Tu utilises un pointeur qui pointe sur on ne sait pas quoi.
      • Partager sur Facebook
      • Partager sur Twitter
        29 juillet 2007 à 21:43:39

        Donc si je cmprends bien j'aurais du faire

        int **tableau;
        **tableau = new int[10];


        Je me trompe?

        EDIT: Bon apparement je me trompe vu que ça a pas l'air de marcher :D . Bon alors si je te comprends bien, c'est parce que j'initialise "*tableau" avant même d'initialiser "tableau"... Donc il faudrait que je fasse

        int **tableau;
        tableau = new int*[10];


        Allez j'essaie ^^ .
        • Partager sur Facebook
        • Partager sur Twitter
          29 juillet 2007 à 21:50:37

          C'est pire :D
          tu as : int **tableau;
          C'est un pointeur de pointeur, donc en mémoire tu as un quelque chose du genre :
          pointeur1 -> pointeur2 -> objet.
          respectivement :
          tableau -> *tableau -> **tableau.
          il faut que tous ces éléments existent pour s'en servir (!)

          Le premier tu l'a bien déclaré : int **tableau;
          Le second, il faut l'allouer, c'est l'étape que tu as sauté dans ton premier code.
          Le troisième, tu l'as bienfait également : *tableau = new int[10];

          A toi de completer l'étape qu'il manque ;)
          • Partager sur Facebook
          • Partager sur Twitter
            29 juillet 2007 à 21:58:44

            Bon je me suis fait griller à 3 minutes près :D .

            Donc je dois trouver ce qui va après "tableau = new ...;".

            Bah... un pointeur d'int?

            EDIT: OK j'ai pigé!!! En fait, le code pour initialiser était:

            int **tableau;
            tableau = new int*;
            *tableau = new int[10];


            Bah merci beaucoup pour ton aide parce que ça fait longtemps qu'à chaque fois que j'essaie de coder quelquechose j'ai besoin d'un pointeur de tableau et que comme un gros boulet je fais un tableau de pointeurs :p .

            Allez bonne nuit ;) .

            • Partager sur Facebook
            • Partager sur Twitter
              29 juillet 2007 à 22:09:49

              Citation

              En fait, le code pour initialiser était: [..]


              Ok ;)

              Citation

              ça fait longtemps qu'à chaque fois que j'essaie de coder quelquechose j'ai besoin d'un pointeur de tableau et que comme un gros boulet je fais un tableau de pointeurs


              C'est pas tout à fait la même chose :p
              A noter que à part pour un tableau multidimensionel, les pointeurs de tableaux ne servent pas souvent, ayant eux-même le comportement d'un pointeur.
              Deuxième remarque : En C++ il y a des outils bien pratique qui permettent de ne pas trop se soucier "de ce qu'il se passe en bas" comme avec les tableaux : la classe std::vector par exemple.

              Bonne nuit' ^^
              • Partager sur Facebook
              • Partager sur Twitter

              erreur de segmentation...

              × 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