Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] sizeof() ne marche pas corréctement

-> Allocation dynamique

Sujet résolu
    11 juillet 2006 à 16:30:13

    Bonjour,
    Voici mon problème :


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

    int main()
    {
        char str1[1024];
        char *str2 = NULL;

        str2 = (char*) malloc(sizeof(char) * 1024);

        printf("\n\n %d \n %d \n\n", sizeof(str1), sizeof(str2));

        return 0;
    }



    Et voici ce que le prog retourne :


    1024
    4


    Pourquoi 4 ? Pourquoi sizeof() n'arrive-t-il pas à trouver la taille d'une variable allouée dynamiquement ? :euh:
    • Partager sur Facebook
    • Partager sur Twitter
      11 juillet 2006 à 16:34:30

      sizeof marche tout à fait correctement.
      En gros, quand on lui donne un tableau, elle renvoie la taille allouée par le tableau. Et quand on lui donne un pointeur elle renvoie la taille du pointeur. Logique.
      • Partager sur Facebook
      • Partager sur Twitter
        11 juillet 2006 à 16:44:07

        Ouais mais tu m'aides pas là :(

        Comment avoir la taille d'un tableau alloué dynamiquement ?


        Puis je croyais que : char *str = "chaine";
        c'était la même chose que : char str[] = "chaine";

        Un tableau après tout ce n'est qu'un pointeur qui pointe la première case de celui-ci, alors comment sizeof() fait-il la différence ?
        • Partager sur Facebook
        • Partager sur Twitter
          11 juillet 2006 à 17:42:26

          Bonjour,
          Un tableau de caractères n'est pas totalement identique à un pointeur vers une chaine de caractères justement dans ce cas. En utilisant la fonction strlen() dans <string.h> et en prenant toujours soin de mettre un "\0" à la fin de tes chaines, tu vas obtenir l'effet voulu dans les deux cas (si c'est pour savoir la longueur d'une chaine, sinon y'a pas moyen dans le 2e cas).
          • Partager sur Facebook
          • Partager sur Twitter
            11 juillet 2006 à 17:55:25

            Citation : ddx39

            Comment avoir la taille d'un tableau alloué dynamiquement ?


            C'est à celui qui a alloué de se souvenir de ce qu'il a fait...
            Ceci est pratique :

            struct dyn_block
            {
               size_t nb_elem;
               T *array;
            };

            Citation : Pas de titre

            Puis je croyais que : char *str = "chaine";
            c'était la même chose que : char str[] = "chaine";


            Pas du tout. Dans un cas, on a un pointeur sur char qui pointe sur le premier caractère de "chaine"... Attention, "chaine" n'étant pas modifiable, il est préférable de coder :
            char const *str = "chaine";

            Dans l'autre, on a un tableau de char initialisé.

            Citation : Pas de titre


            Un tableau après tout ce n'est qu'un pointeur qui pointe la première case de celui-ci, alors comment sizeof() fait-il la différence ?


            Un tableau n'est pas un pointeur.
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              11 juillet 2006 à 20:05:15

              Citation : -ed-

              C'est à celui qui a alloué de se souvenir de ce qu'il a fait...



              Oui, c'est ce que j'ai fait mais bon disons que la taille de la chaine allouée dynamiquement dépend de beaucoups de choses, donc le malloc il ressemble à quelque chose comme : malloc(sizeof(char) * (strlen(str1) + strlen(str2) +32)) donc si je devais mettre ça à chaque fois que j'utilise la chaine dans une fonction du genre fread() c'est assez lourd quand-même, mais j'ai trouvé la solution toute bête ^^ : stocker cette taille dans une variable :p

              Merci pour vos réponses, problème résolut ;)

              • Partager sur Facebook
              • Partager sur Twitter

              [C] sizeof() ne marche pas corréctement

              × 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