Why is a temporary char** argument illegal?
Clash Royale CLAN TAG#URR8PPP
up vote
16
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 it into
char * p[2] = "a", "b";
f(p);
and that went fine [would have been also fine with just char * p
].
Why can't I create an array of pointers on the fly like the following?
f("a", "b");
c
add a comment |Â
up vote
16
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 it into
char * p[2] = "a", "b";
f(p);
and that went fine [would have been also fine with just char * p
].
Why can't I create an array of pointers on the fly like the following?
f("a", "b");
c
add a comment |Â
up vote
16
down vote
favorite
up vote
16
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 it into
char * p[2] = "a", "b";
f(p);
and that went fine [would have been also fine with just char * p
].
Why can't I create an array of pointers on the fly like the following?
f("a", "b");
c
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 it into
char * p[2] = "a", "b";
f(p);
and that went fine [would have been also fine with just char * p
].
Why can't I create an array of pointers on the fly like the following?
f("a", "b");
c
c
edited 17 mins ago
Peter Mortensen
13.2k1983111
13.2k1983111
asked 5 hours ago
CIsForCookies
6,55111443
6,55111443
add a comment |Â
add a comment |Â
3 Answers
3
active
oldest
votes
up vote
24
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.
add a comment |Â
up vote
11
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.
add a comment |Â
up vote
3
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.
GCC provide this feature as an extension too - This (f((char *)"a","b");
) would not have worked on Clang?
â CIsForCookies
5 hours ago
1
@CIsForCookies; Clang also provide the same as an extension. In clangint y = (int ) 1, 2, 3;
will work too while GCC will throw an error.
â haccks
5 hours ago
add a comment |Â
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
24
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.
add a comment |Â
up vote
24
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.
add a comment |Â
up vote
24
down vote
accepted
up vote
24
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.
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.
edited 5 hours ago
answered 5 hours ago
dbush
86.7k1092125
86.7k1092125
add a comment |Â
add a comment |Â
up vote
11
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.
add a comment |Â
up vote
11
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.
add a comment |Â
up vote
11
down vote
up vote
11
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.
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.
answered 5 hours ago
dasblinkenlight
603k547591176
603k547591176
add a comment |Â
add a comment |Â
up vote
3
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.
GCC provide this feature as an extension too - This (f((char *)"a","b");
) would not have worked on Clang?
â CIsForCookies
5 hours ago
1
@CIsForCookies; Clang also provide the same as an extension. In clangint y = (int ) 1, 2, 3;
will work too while GCC will throw an error.
â haccks
5 hours ago
add a comment |Â
up vote
3
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.
GCC provide this feature as an extension too - This (f((char *)"a","b");
) would not have worked on Clang?
â CIsForCookies
5 hours ago
1
@CIsForCookies; Clang also provide the same as an extension. In clangint y = (int ) 1, 2, 3;
will work too while GCC will throw an error.
â haccks
5 hours ago
add a comment |Â
up vote
3
down vote
up vote
3
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.
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.
edited 5 hours ago
answered 5 hours 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
5 hours ago
1
@CIsForCookies; Clang also provide the same as an extension. In clangint y = (int ) 1, 2, 3;
will work too while GCC will throw an error.
â haccks
5 hours ago
add a comment |Â
GCC provide this feature as an extension too - This (f((char *)"a","b");
) would not have worked on Clang?
â CIsForCookies
5 hours ago
1
@CIsForCookies; Clang also provide the same as an extension. In clangint y = (int ) 1, 2, 3;
will work too while GCC will throw an error.
â haccks
5 hours ago
GCC provide this feature as an extension too - This (
f((char *)"a","b");
) would not have worked on Clang?â CIsForCookies
5 hours ago
GCC provide this feature as an extension too - This (
f((char *)"a","b");
) would not have worked on Clang?â CIsForCookies
5 hours ago
1
1
@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
5 hours 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
5 hours ago
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53083520%2fwhy-is-a-temporary-char-argument-illegal%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password