Why is temporary char** argument illegal?

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
7
down vote

favorite












I have a function f(char **p) and I wanted to call it in the simplest way I could.



I tried char ** p = "a", "b"; f(p); and got:




scalar object requires one element in initializer




so I changed into char * p[2] = "a", "b"; f(p); and that went fine [would have been also fine with just char * p].



My question is, why can't I create an array of pointers on the fly like this:



f("a","b");









share|improve this question



























    up vote
    7
    down vote

    favorite












    I have a function f(char **p) and I wanted to call it in the simplest way I could.



    I tried char ** p = "a", "b"; f(p); and got:




    scalar object requires one element in initializer




    so I changed into char * p[2] = "a", "b"; f(p); and that went fine [would have been also fine with just char * p].



    My question is, why can't I create an array of pointers on the fly like this:



    f("a","b");









    share|improve this question

























      up vote
      7
      down vote

      favorite









      up vote
      7
      down vote

      favorite











      I have a function f(char **p) and I wanted to call it in the simplest way I could.



      I tried char ** p = "a", "b"; f(p); and got:




      scalar object requires one element in initializer




      so I changed into char * p[2] = "a", "b"; f(p); and that went fine [would have been also fine with just char * p].



      My question is, why can't I create an array of pointers on the fly like this:



      f("a","b");









      share|improve this question















      I have a function f(char **p) and I wanted to call it in the simplest way I could.



      I tried char ** p = "a", "b"; f(p); and got:




      scalar object requires one element in initializer




      so I changed into char * p[2] = "a", "b"; f(p); and that went fine [would have been also fine with just char * p].



      My question is, why can't I create an array of pointers on the fly like this:



      f("a","b");






      c






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 16 mins ago









      dbush

      86.6k1091124




      86.6k1091124










      asked 36 mins ago









      CIsForCookies

      6,50611441




      6,50611441






















          3 Answers
          3






          active

          oldest

          votes

















          up vote
          9
          down vote



          accepted










          This gives a warning:



          char ** p = "a", "b";


          because p is not an array.



          This is also not legal:



          f("a", "b");


          since curly braces by themselves are not allowed in an expression (but can be used as an initializer).



          It is possible to create an array on the fly like that using a compound literal:



          f((char *)"a", "b");


          You could also use a compound literal to initialize a temporary:



          char ** p = (char *)"a", "b";


          Unlike the first statement, this is valid because the literal is an array of type char *[2] and will decay to a char ** which can be used to initialize a variable of this type.



          See section 6.5.2.5 of the C standard for more details on compound literals.






          share|improve this answer





























            up vote
            5
            down vote













            This declaration char ** p = "a", "b"; triggers a warning because C does not know how to interpret the content of braces:



            • Declaration type char** suggests it's a single pointer-to-pointer-to-char

            • Content of specifies two items.

            You need to tell C that you are initializing a pointer to pointer with a pointer to the initial element of an anonymous array by specifying a type in front of the braces:



            char ** p = (char*)"a", "b"


            This construct is called a "compound literal". It could be used in a declaration, but it also works as an expression.



            Note: if you are planning to pass an array like that to a function, you need to provide a way to determine the size of the array. One approach is to pass NULL to "terminate" the array, like this:



            void f(char **p) 
            int i = 0;
            while (*p)
            printf("%d:%sn", i++, *p++);


            int main(void)
            f((char*)"a", "b", NULL);
            return 0;



            Demo.






            share|improve this answer



























              up vote
              2
              down vote













              C99 and later added compound literals for the exact purpose: creating array and structs on the fly

              Example:



              struct foo int a; char b[2]; structure;
              structure = ((struct foo) 1, 'a', 0);
              int *y = (int ) 1, 2, 3;
              int *z = (int ) 1;


              Apart from std C99 and later, GCC provide this feature as an extension too.

              In you case this will work



              f((char *)"a","b");


              (char *)"a","b" is a compound literal which creates an array of 2 pointers to char on the fly.






              share|improve this answer






















              • GCC provide this feature as an extension too - This (f((char *)"a","b");) would not have worked on Clang?
                – CIsForCookies
                17 mins ago










              • @CIsForCookies; Clang also provide the same as an extension. In clang int y = (int ) 1, 2, 3; will work too while GCC will throw an error.
                – haccks
                9 mins ago











              Your Answer






              StackExchange.ifUsing("editor", function ()
              StackExchange.using("externalEditor", function ()
              StackExchange.using("snippets", function ()
              StackExchange.snippets.init();
              );
              );
              , "code-snippets");

              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "1"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              convertImagesToLinks: true,
              noModals: false,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "",
              contentPolicyHtml: "",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













               

              draft saved


              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53083520%2fwhy-is-temporary-char-argument-illegal%23new-answer', 'question_page');

              );

              Post as a guest






























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes








              up vote
              9
              down vote



              accepted










              This gives a warning:



              char ** p = "a", "b";


              because p is not an array.



              This is also not legal:



              f("a", "b");


              since curly braces by themselves are not allowed in an expression (but can be used as an initializer).



              It is possible to create an array on the fly like that using a compound literal:



              f((char *)"a", "b");


              You could also use a compound literal to initialize a temporary:



              char ** p = (char *)"a", "b";


              Unlike the first statement, this is valid because the literal is an array of type char *[2] and will decay to a char ** which can be used to initialize a variable of this type.



              See section 6.5.2.5 of the C standard for more details on compound literals.






              share|improve this answer


























                up vote
                9
                down vote



                accepted










                This gives a warning:



                char ** p = "a", "b";


                because p is not an array.



                This is also not legal:



                f("a", "b");


                since curly braces by themselves are not allowed in an expression (but can be used as an initializer).



                It is possible to create an array on the fly like that using a compound literal:



                f((char *)"a", "b");


                You could also use a compound literal to initialize a temporary:



                char ** p = (char *)"a", "b";


                Unlike the first statement, this is valid because the literal is an array of type char *[2] and will decay to a char ** which can be used to initialize a variable of this type.



                See section 6.5.2.5 of the C standard for more details on compound literals.






                share|improve this answer
























                  up vote
                  9
                  down vote



                  accepted







                  up vote
                  9
                  down vote



                  accepted






                  This gives a warning:



                  char ** p = "a", "b";


                  because p is not an array.



                  This is also not legal:



                  f("a", "b");


                  since curly braces by themselves are not allowed in an expression (but can be used as an initializer).



                  It is possible to create an array on the fly like that using a compound literal:



                  f((char *)"a", "b");


                  You could also use a compound literal to initialize a temporary:



                  char ** p = (char *)"a", "b";


                  Unlike the first statement, this is valid because the literal is an array of type char *[2] and will decay to a char ** which can be used to initialize a variable of this type.



                  See section 6.5.2.5 of the C standard for more details on compound literals.






                  share|improve this answer














                  This gives a warning:



                  char ** p = "a", "b";


                  because p is not an array.



                  This is also not legal:



                  f("a", "b");


                  since curly braces by themselves are not allowed in an expression (but can be used as an initializer).



                  It is possible to create an array on the fly like that using a compound literal:



                  f((char *)"a", "b");


                  You could also use a compound literal to initialize a temporary:



                  char ** p = (char *)"a", "b";


                  Unlike the first statement, this is valid because the literal is an array of type char *[2] and will decay to a char ** which can be used to initialize a variable of this type.



                  See section 6.5.2.5 of the C standard for more details on compound literals.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 11 mins ago

























                  answered 34 mins ago









                  dbush

                  86.6k1091124




                  86.6k1091124






















                      up vote
                      5
                      down vote













                      This declaration char ** p = "a", "b"; triggers a warning because C does not know how to interpret the content of braces:



                      • Declaration type char** suggests it's a single pointer-to-pointer-to-char

                      • Content of specifies two items.

                      You need to tell C that you are initializing a pointer to pointer with a pointer to the initial element of an anonymous array by specifying a type in front of the braces:



                      char ** p = (char*)"a", "b"


                      This construct is called a "compound literal". It could be used in a declaration, but it also works as an expression.



                      Note: if you are planning to pass an array like that to a function, you need to provide a way to determine the size of the array. One approach is to pass NULL to "terminate" the array, like this:



                      void f(char **p) 
                      int i = 0;
                      while (*p)
                      printf("%d:%sn", i++, *p++);


                      int main(void)
                      f((char*)"a", "b", NULL);
                      return 0;



                      Demo.






                      share|improve this answer
























                        up vote
                        5
                        down vote













                        This declaration char ** p = "a", "b"; triggers a warning because C does not know how to interpret the content of braces:



                        • Declaration type char** suggests it's a single pointer-to-pointer-to-char

                        • Content of specifies two items.

                        You need to tell C that you are initializing a pointer to pointer with a pointer to the initial element of an anonymous array by specifying a type in front of the braces:



                        char ** p = (char*)"a", "b"


                        This construct is called a "compound literal". It could be used in a declaration, but it also works as an expression.



                        Note: if you are planning to pass an array like that to a function, you need to provide a way to determine the size of the array. One approach is to pass NULL to "terminate" the array, like this:



                        void f(char **p) 
                        int i = 0;
                        while (*p)
                        printf("%d:%sn", i++, *p++);


                        int main(void)
                        f((char*)"a", "b", NULL);
                        return 0;



                        Demo.






                        share|improve this answer






















                          up vote
                          5
                          down vote










                          up vote
                          5
                          down vote









                          This declaration char ** p = "a", "b"; triggers a warning because C does not know how to interpret the content of braces:



                          • Declaration type char** suggests it's a single pointer-to-pointer-to-char

                          • Content of specifies two items.

                          You need to tell C that you are initializing a pointer to pointer with a pointer to the initial element of an anonymous array by specifying a type in front of the braces:



                          char ** p = (char*)"a", "b"


                          This construct is called a "compound literal". It could be used in a declaration, but it also works as an expression.



                          Note: if you are planning to pass an array like that to a function, you need to provide a way to determine the size of the array. One approach is to pass NULL to "terminate" the array, like this:



                          void f(char **p) 
                          int i = 0;
                          while (*p)
                          printf("%d:%sn", i++, *p++);


                          int main(void)
                          f((char*)"a", "b", NULL);
                          return 0;



                          Demo.






                          share|improve this answer












                          This declaration char ** p = "a", "b"; triggers a warning because C does not know how to interpret the content of braces:



                          • Declaration type char** suggests it's a single pointer-to-pointer-to-char

                          • Content of specifies two items.

                          You need to tell C that you are initializing a pointer to pointer with a pointer to the initial element of an anonymous array by specifying a type in front of the braces:



                          char ** p = (char*)"a", "b"


                          This construct is called a "compound literal". It could be used in a declaration, but it also works as an expression.



                          Note: if you are planning to pass an array like that to a function, you need to provide a way to determine the size of the array. One approach is to pass NULL to "terminate" the array, like this:



                          void f(char **p) 
                          int i = 0;
                          while (*p)
                          printf("%d:%sn", i++, *p++);


                          int main(void)
                          f((char*)"a", "b", NULL);
                          return 0;



                          Demo.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered 30 mins ago









                          dasblinkenlight

                          603k547591174




                          603k547591174




















                              up vote
                              2
                              down vote













                              C99 and later added compound literals for the exact purpose: creating array and structs on the fly

                              Example:



                              struct foo int a; char b[2]; structure;
                              structure = ((struct foo) 1, 'a', 0);
                              int *y = (int ) 1, 2, 3;
                              int *z = (int ) 1;


                              Apart from std C99 and later, GCC provide this feature as an extension too.

                              In you case this will work



                              f((char *)"a","b");


                              (char *)"a","b" is a compound literal which creates an array of 2 pointers to char on the fly.






                              share|improve this answer






















                              • GCC provide this feature as an extension too - This (f((char *)"a","b");) would not have worked on Clang?
                                – CIsForCookies
                                17 mins ago










                              • @CIsForCookies; Clang also provide the same as an extension. In clang int y = (int ) 1, 2, 3; will work too while GCC will throw an error.
                                – haccks
                                9 mins ago















                              up vote
                              2
                              down vote













                              C99 and later added compound literals for the exact purpose: creating array and structs on the fly

                              Example:



                              struct foo int a; char b[2]; structure;
                              structure = ((struct foo) 1, 'a', 0);
                              int *y = (int ) 1, 2, 3;
                              int *z = (int ) 1;


                              Apart from std C99 and later, GCC provide this feature as an extension too.

                              In you case this will work



                              f((char *)"a","b");


                              (char *)"a","b" is a compound literal which creates an array of 2 pointers to char on the fly.






                              share|improve this answer






















                              • GCC provide this feature as an extension too - This (f((char *)"a","b");) would not have worked on Clang?
                                – CIsForCookies
                                17 mins ago










                              • @CIsForCookies; Clang also provide the same as an extension. In clang int y = (int ) 1, 2, 3; will work too while GCC will throw an error.
                                – haccks
                                9 mins ago













                              up vote
                              2
                              down vote










                              up vote
                              2
                              down vote









                              C99 and later added compound literals for the exact purpose: creating array and structs on the fly

                              Example:



                              struct foo int a; char b[2]; structure;
                              structure = ((struct foo) 1, 'a', 0);
                              int *y = (int ) 1, 2, 3;
                              int *z = (int ) 1;


                              Apart from std C99 and later, GCC provide this feature as an extension too.

                              In you case this will work



                              f((char *)"a","b");


                              (char *)"a","b" is a compound literal which creates an array of 2 pointers to char on the fly.






                              share|improve this answer














                              C99 and later added compound literals for the exact purpose: creating array and structs on the fly

                              Example:



                              struct foo int a; char b[2]; structure;
                              structure = ((struct foo) 1, 'a', 0);
                              int *y = (int ) 1, 2, 3;
                              int *z = (int ) 1;


                              Apart from std C99 and later, GCC provide this feature as an extension too.

                              In you case this will work



                              f((char *)"a","b");


                              (char *)"a","b" is a compound literal which creates an array of 2 pointers to char on the fly.







                              share|improve this answer














                              share|improve this answer



                              share|improve this answer








                              edited 11 mins ago

























                              answered 25 mins ago









                              haccks

                              84.8k20125216




                              84.8k20125216











                              • GCC provide this feature as an extension too - This (f((char *)"a","b");) would not have worked on Clang?
                                – CIsForCookies
                                17 mins ago










                              • @CIsForCookies; Clang also provide the same as an extension. In clang int y = (int ) 1, 2, 3; will work too while GCC will throw an error.
                                – haccks
                                9 mins ago

















                              • GCC provide this feature as an extension too - This (f((char *)"a","b");) would not have worked on Clang?
                                – CIsForCookies
                                17 mins ago










                              • @CIsForCookies; Clang also provide the same as an extension. In clang int y = (int ) 1, 2, 3; will work too while GCC will throw an error.
                                – haccks
                                9 mins ago
















                              GCC provide this feature as an extension too - This (f((char *)"a","b");) would not have worked on Clang?
                              – CIsForCookies
                              17 mins ago




                              GCC provide this feature as an extension too - This (f((char *)"a","b");) would not have worked on Clang?
                              – CIsForCookies
                              17 mins ago












                              @CIsForCookies; Clang also provide the same as an extension. In clang int y = (int ) 1, 2, 3; will work too while GCC will throw an error.
                              – haccks
                              9 mins ago





                              @CIsForCookies; Clang also provide the same as an extension. In clang int y = (int ) 1, 2, 3; will work too while GCC will throw an error.
                              – haccks
                              9 mins ago


















                               

                              draft saved


                              draft discarded















































                               


                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53083520%2fwhy-is-temporary-char-argument-illegal%23new-answer', 'question_page');

                              );

                              Post as a guest













































































                              Comments

                              Popular posts from this blog

                              What does second last employer means? [closed]

                              List of Gilmore Girls characters

                              Confectionery