Partage
  • Partager sur Facebook
  • Partager sur Twitter

Allocation dynamique 2D

Sujet résolu
    23 juillet 2006 à 19:50:37

    Salut,
    je sais qu'il doit y avoir des sujets la dessus, mais même après avoir cherché, ca marche pas...

    Je voudrais créer un tableau de tableaux de char, pour stocker plusieurs phrases en fait.

    phrases = malloc(9 * sizeof(char*));
            if(phrases == NULL)
                   exit(EXIT_FAILURE);
            else
            {
                   for(i=0; i<9; i++)
                   {
                            phrases[i] = malloc(MALLOC_SIZE * sizeof(char));
                          if(phrases[i] == NULL)
                                 exit(EXIT_FAILURE);
                   }
            }


    Je crois avoir lu quelque part que c'était correct.
    Or, dès que j'essaye quelque chose comme
    sprintf(phrase[0], "super phrase!!");

    Fatal signal: Segmentation Fault (SDL Parachute Deployed)

    Quelqu'un pourrait me dire ou se trouve mon erreur?
    Merci!
    • Partager sur Facebook
    • Partager sur Twitter
      23 juillet 2006 à 19:57:47

      Citation : Arkhiall

      je sais qu'il doit y avoir des sujets la dessus, mais même après avoir cherché, ca marche pas...

      Je voudrais créer un tableau de tableaux de char, pour stocker plusieurs phrases en fait.
      <...>
      Fatal signal: Segmentation Fault (SDL Parachute Deployed)

      Quelqu'un pourrait me dire ou se trouve mon erreur?


      Ton code est incomplet. Ni MALLOC_SIZE, ni 'phrases', ni 'phrase' ne sont définis...

      Ceci fonctionne :

      #include <stdio.h>
      #include <stdlib.h>

      #define SIZE 32

      int main ()
      {
         char **phrases = malloc (9 * sizeof (char *));
         if (phrases == NULL)
            exit (EXIT_FAILURE);
         else
         {
            size_t i;
            for (i = 0; i < 9; i++)
            {
               phrases[i] = malloc (SIZE);
               if (phrases[i] == NULL)
               {
                  exit (EXIT_FAILURE);
               }
            }
         }

         sprintf (phrases[3], "super phrase!!");
         printf ("phrases[3] = '%s'\n", phrases[3]);
         return 0;
      }
      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        23 juillet 2006 à 20:14:02

        Citation : -ed-


        Ceci fonctionne :


        #include <stdio.h>
        #include <stdlib.h>

        #define SIZE 32

        int main ()
        {
           char **phrases = malloc (9 * sizeof (char *));
           if (phrases == NULL)
              exit (EXIT_FAILURE);
           else
           {
              size_t i;
              for (i = 0; i < 9; i++)
              {
                 phrases[i] = malloc (SIZE);
                 if (phrases[i] == NULL)
                 {
                    exit (EXIT_FAILURE);
                 }
              }
           }

           sprintf (phrases[3], "super phrase!!");
           printf ("phrases[3] = '%s'\n", phrases[3]);
           return 0;
        }


        Il manque à 'ceci' des antislashs avant les apostrophes dans le printf :p

        printf ("phrases[3] = \'%s\'\n", phrases[3]);


        Mais, je ne crois pas qu'allouer chaque "case" de ton tableau de pointeurs soit très utile...

        char **chaines;
        chaines = (char**)malloc(sizeof(char) * 9);

        chaines[2] = "coucou :)";

        printf("chaines[2] = %s\n", chaines[2]);


        Je crois que ce code marche :D

        Enfin ce n'est qu'un autre exemple après tout.

        Ce que je trouve bizarre, c'est que ça soit la SDL qui trouve une erreur :p
        Enfin tu te sert de tes chaines dans la SDL je suppose ^^
        • Partager sur Facebook
        • Partager sur Twitter
          23 juillet 2006 à 20:20:40

          Citation : Yno

          Citation : -ed-


          Ceci fonctionne :


             printf ("phrases[3] = '%s'\n", phrases[3]);
          }



          Il manque à 'ceci' des antislashs avant les apostrophes dans le printf :p


          T'es sûr de ce que tu dis ou tu balances des trucs au hasard pour voir ? Les apostrophes n'ont pas besoin de \ dans une chaine. Tu confonds soit avec les guillemets dans une chaine soit avec le caractère apostrophe.

          Citation : Pas de titre


          Mais, je ne crois pas qu'allouer chaque "case" de ton tableau de pointeurs soit très utile...

          char **chaines;
          chaines = (char**)malloc(sizeof(char) * 9);
          </citation>
          A quoi sert le cast ?
          <citation nom="Pas de titre">
          chaines[2] = "coucou :)";

          printf("chaines[2] = %s\n", chaines[2]);



          Je crois que ce code marche :D


          OK, mais la chaine pointée n'est pas modifiable. Et ce n'est pas ce que voulais le P.O.
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            23 juillet 2006 à 20:34:35

            Merci beaucoup ed, ca marche, mais j'ai pas vraiment compris ce qui diffère de mon code...

            phrases était bien défini comme un char** et MALLOC_SIZE était défini a 200 ; je ne les avais pas mis pour alléger, désolé.

            Ou était mon erreur?
            • Partager sur Facebook
            • Partager sur Twitter
              23 juillet 2006 à 20:37:09

              Citation : Arkhiall

              Ou était mon erreur?


              Je n'ai pas vu d'erreur, et comme tu n'as pas indiqué quel était le problème, difficile d'en dire plus...
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                23 juillet 2006 à 20:40:10

                Le problème c'était le Fatal signal: Segmentation Fault (SDL Parachute Deployed) lol
                Bizarre j'avais du faire une co****rie...

                Enfin merci quand même ;)
                • Partager sur Facebook
                • Partager sur Twitter

                Allocation dynamique 2D

                × 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