Partage
  • Partager sur Facebook
  • Partager sur Twitter

Allocation bizarre ...

wtf ?

Sujet résolu
    5 décembre 2006 à 16:59:46

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

    int main(void)
    {
       int sz;
       scanf ("%d", &sz);

       char str[sz];
       printf ("%d", sizeof str);

       return 0;
    }


    Bonjour, hier soir j'ai été bouleversé lorsque j'ai constaté que le code précedent compile parfaitement sous Code::Blocks o_O
    Comment est-ce possible ? 0_o
    Et l'allocation dynamique dans tout ça ? o_O
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      5 décembre 2006 à 17:02:41

      Cette possibilité a été introduite avec la norme C99, une sorte de rechiure infâme pompée dans d'autres langages... mais tous les compilateurs ne supportant pas intégralement cette norme, c'est à proscrire totalement.


      Quand pourra t'on faire du visual basic ou du python en C???
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        5 décembre 2006 à 17:12:50

        Citation : ddx39

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

        int main(void)
        {
           int sz;
           scanf ("%d", &sz);

           char str[sz];
           printf ("%d", sizeof str);

           return 0;
        }



        Bonjour, hier soir j'ai été bouleversé lorsque j'ai constaté que le code précedent compile parfaitement sous Code::Blocks o_O
        Comment est-ce possible ? 0_o
        Et l'allocation dynamique dans tout ça ? o_O



        Chez moi personnelement ça compile pas. Active tous les messages "warning", tu verras, ça compilera plus.
        • Partager sur Facebook
        • Partager sur Twitter
          5 décembre 2006 à 17:28:41

          Citation : Barbidou54

          Chez moi personnelement ça compile pas. Active tous les messages "warning", tu verras, ça compilera plus.



          Voici la config de mon compilateur :
          -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int
          -Werror-implicit-function-declaration -Wmain -Wparentheses
          -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused
          -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef
          -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings
          -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes
          -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn
          -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations
          -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long
          -Wunreachable-code


          Je ne pense pas que l'on puisse faire plus paranoïaque que celà =P
          • Partager sur Facebook
          • Partager sur Twitter
            5 décembre 2006 à 17:45:13

            comme dit plus haut, regarde quel version de mingW tu as.
            • Partager sur Facebook
            • Partager sur Twitter
              5 décembre 2006 à 17:50:54

              Citation : minirop

              comme dit plus haut, regarde quel version de mingW tu as.

              3.4.4

              Effectivement, je viens de me renseigner et j'ai appris que les tableaux dynamiques sont une des nouveautés de la norme C99.
              • Partager sur Facebook
              • Partager sur Twitter
                5 décembre 2006 à 18:16:39

                Citation : ddx39

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

                int main(void)
                {
                   int sz;
                   scanf ("%d", &sz);

                   char str[sz];
                   printf ("%d", sizeof str);

                   return 0;
                }



                Bonjour, hier soir j'ai été bouleversé lorsque j'ai constaté que le code précedent compile parfaitement sous Code::Blocks o_O
                Comment est-ce possible ? 0_o
                Et l'allocation dynamique dans tout ça ? o_O


                Il s'agit des VLA (Variable Length Arrays). C'est une extension de gcc depuis longtemps. C'est devenu une fonctionnalité du langage C depuis la dernière révision du langage (C99).

                Evidemment, il y a quelques différences avec l'extension de gcc. (Ben oui, c'est le Comité qui fait la norme, c'est pas les implémenteurs fussent-ils libres... et membres éminents du Comité... bref.)

                Malheureusement, il n'existe pas, à ma connaissance, d'implémentation libre de cette fonctionnalité qui soit opérationnelle. Sauf information récente que j'ignorerais (je ne vais pas voir tous les jours), l'état de développement des VLA de gcc est toujours 'broken'.

                De toutes façons, sur le plan pratique, c'est pas interessant. La mémoire dynamique traditionnelle (malloc()/free()) est beaucoup plus fiable.

                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  5 décembre 2006 à 18:21:41

                  Ok, merci pour vos réponses, problème résolu ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 décembre 2006 à 19:14:32

                    Citation : -ed-

                    Citation : ddx39

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

                    int main(void)
                    {
                       int sz;
                       scanf ("%d", &sz);

                       char str[sz];
                       printf ("%d", sizeof str);

                       return 0;
                    }



                    Bonjour, hier soir j'ai été bouleversé lorsque j'ai constaté que le code précedent compile parfaitement sous Code::Blocks o_O
                    Comment est-ce possible ? 0_o
                    Et l'allocation dynamique dans tout ça ? o_O


                    Il s'agit des VLA (Variable Length Arrays). C'est une extension de gcc depuis longtemps. C'est devenu une fonctionnalité du langage C depuis la dernière révision du langage (C99).

                    Evidemment, il y a quelques différences avec l'extension de gcc. (Ben oui, c'est le Comité qui fait la norme, c'est pas les implémenteurs fussent-ils libres... et membres éminents du Comité... bref.)

                    Malheureusement, il n'existe pas, à ma connaissance, d'implémentation libre de cette fonctionnalité qui soit opérationnelle. Sauf information récente que j'ignorerais (je ne vais pas voir tous les jours), l'état de développement des VLA de gcc est toujours 'broken'.

                    De toutes façons, sur le plan pratique, c'est pas interessant. La mémoire dynamique traditionnelle (malloc()/free()) est beaucoup plus fiable.


                    -ed-, est-ce que faire :

                    /* ... */
                    int n;
                    /* ... */
                    char s[n];

                    Est équivalent à :

                    /* ... */
                    int n;
                    /* ... */
                    char *s = alloca(n);

                    Est-ce que alloca () est standard? fiable ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 décembre 2006 à 19:24:49

                      Citation : asmanur

                      -ed-, est-ce que faire :


                      /* ... */
                      int n;
                      /* ... */
                      char s[n];


                      Est équivalent à :


                      /* ... */
                      int n;
                      /* ... */
                      char *s = alloca(n);


                      Est-ce que alloca () est standard? fiable ?


                      Non standard. C'est très proche et c'est, en théorie, un peu plus fiable :

                         char *s = alloca(n);
                         if (s != NULL)
                         {

                      Au moins, le mécanisme de détection de l'erreur est implémentable. L'est-il réellement ? C'est une autre question. A ma connaissance, alloca() est déclaré obsolète par POSIX.1.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !
                        5 décembre 2006 à 19:45:40

                        Citation : -ed-

                        Au moins, le mécanisme de détection de l'erreur est implémentable. L'est-il réellement ? C'est une autre question. A ma connaissance, alloca() est déclaré obsolète par POSIX.1.


                        Pour ma part, avec mon gcc, alloca() est builtin et inline. Aucune vérification d'erreur, NULL n'est jamais retourné...

                        HISTORIQUE
                        Il semble que alloca soit apparue dans 32v, pwb, pwb.2, 3BSD, et 4BSD.
                        Il y a une page de manuel la décrivant dans BSD 4.3. Linux utilise la
                        version GNU. Cette fonction n'est décrite ni par POSIX ni par SUSv3.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Allocation bizarre ...

                        × 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