Partage
  • Partager sur Facebook
  • Partager sur Twitter

char* == char[] ?

    17 février 2006 à 2:18:11

    youhou^^, en faisant des tests j'ai rencontré un petit problème que je ne comprends pas
    il est dit qu'une variable contenant un tableau de caractères est en fait un pointeur contenant l'adresse du premier caractère, on peut donc déclarer une chaîne de deux manières différentes: char str[] ou char *str
    mais en essayant de modifier un caractère de la chaîne il y a un petit souci:

    int main(int argc, char *argv[])
    {
            char str[] = "Salut!";
           
            printf("%s\n", str); // affiche Salut!
           
            getchar();
            return 0;
    }


    int main(int argc, char *argv[])
    {
            char *str = "Salut!";
           
            printf("%s\n", str); // affiche Salut!
           
            getchar();
            return 0;
    }


    int main(int argc, char *argv[])
    {
            char str[] = "Salut!";
           
            *(str + 1) = 'o';
           
            printf("%s\n", str); // affiche Solut!
           
            getchar();
            return 0;
    }


    int main(int argc, char *argv[])
    {
            char *str = "Salut!";
           
            *(str + 1) = 'o';
           
            printf("%s\n", str); // affiche rien du tout parce que plantage
           
            getchar();
            return 0;
    }


    voilà, sur ce dernier code le programme plante (pas la compilation) et je ne vois pas pourquoi ni comment :p
    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2006 à 7:03:27

      Personne n'a dit que c'était la même chose, c'est dans ton imagination ; un tableau reste un tableau, un pointeur un pointeur ; même si conversions automatiques il y a.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        17 février 2006 à 10:41:33

        Je dirais plutôt que char[] est équivalent à const char*

        En fait le nom du tableau est converti automatiquement en un pointeur constant sur son premier élément (sauf dans les cas d'utilisation de sizeof et &), c'est pour ça que c'est toujours pas exactement la même chose, et les tableaux et pointeurs sont bien des types différents. Ainsi en essayant de le modifier, après avoir initialisé un pointeur non constant dessus, tu peux arriver à un plantage car le système d'exploitation ne te laisse pas modifier les opbjets constants, mais ça pourrait aussi laisser faire, ça dépend de l'implémentation.
        • Partager sur Facebook
        • Partager sur Twitter
          17 février 2006 à 11:44:34

          essaie en modifiant :
          *(str + 1) = 'o';

          par :
          str[1]='o';
          • Partager sur Facebook
          • Partager sur Twitter
            18 février 2006 à 0:29:07

            char *str = "Salut!";
            str est un pointeur poitant sur la constante "Salut!"

            char str[] = "Salut!";
            str pointe sur le début d'un tableau de 7 cases initialisé en copiant Salut! (et un 0 terminal) dedans.

            Pour faire vite, tu peux faire ça:

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

            int main(int argc, char *argv[])
            {
                    char *str = strdup("Salut!");
                   
                    *(str + 1) = 'o';
                   
                    printf("%s\n", str);

                    free(str);

                    getchar();
                    return 0;
            }

            a+
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              18 février 2006 à 10:56:04

              En fait quand tu tappes "salut" le compilateur crée une chaîne constante, donc ti tu fais un pointeur non constant dessus, tu ne sais pas trop ce qui peut arriver, la modification peut avoir lieu ou pas. Le mieux est quand même de créer un tableau ;)

              xgarreau c'est quoi strdup ? Connais pas.
              • Partager sur Facebook
              • Partager sur Twitter
                18 février 2006 à 11:16:39

                Bah, louisclem tu confonds pointeur constant (char *const) et pointeur sur éléments constants (const char *). Et puis en fait en C, une chaîne litérale n'est pas un tableau d'éléments constants mais un tableaux d'éléments qu'il n'est pas permis de modifier mais pas constants quand même.

                strdup c'est une fonction Unix qui malloc et strcpy.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  18 février 2006 à 11:45:15

                  Okkkkay j'viens de relire un cours sur ça. En effets elles ne sont pas forcément const (sinon, il faudrait sans doute un cast pour stocker son adresse dans un pointeur char*, cela me troublait, maintenant j'ai compris), et le comportement est indéfini en cas de tentative de modification :D:)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 février 2006 à 14:02:42

                    Citation : louisclem

                    xgarreau c'est quoi strdup ? Connais pas.



                    Comme l'a exmpliqué rz0, c'est une fonction qui malloc et copie la chaîne passée en paramètre. Elle renvoit un pointeur sur la zone de mémoire allouée, contenant la copie, ou NULL, si elle n'a pas pu allouer.

                    Sous windows, il faut inclure <string.h>, comme sous unix et la préfixer d'un _ (optionnel, mais c'est mieux dit Microsoft, on en a déjà parlé dans un thread à propos d'open, lseek et compagnie)

                    Comme de la mémoir eest allouée, il ne faut pas oublier de faire un free sur le pointeur quand on ne s'en sert plus.

                    Pour les détails unixiens: man strdup
                    Pour les détails windowsiens: http://msdn.microsoft.com/library/en-us/vccore98/html/_crt__strdup.2c_._wcsdup.2c_._mbsdup.asp

                    a+
                    • Partager sur Facebook
                    • Partager sur Twitter

                    char* == char[] ?

                    × 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