Both GCC and Clang do not complain if I assign a string literal to a char*
, even when using lots of pedantic options (-Wall -W -pedantic -std=c99
):
char *foo = "bar";
while they (of course) do complain if I assign a const char*
to a char*
.
Does this mean that string literals are considered to be of char*
type? Shouldn't they be const char*
? It's not defined behavior if they get modified!
And (an uncorrelated question) what about command line parameters (ie: argv
): is it considered to be an array of string literals?
They are of type char[N]
where N
is the number of characters including the terminating \0
. So yes you can assign them to char*
, but you still cannot write to them (the effect will be undefined).
Wrt argv
: It points to an array of pointers to strings. Those strings are explicitly modifiable. You can change them and they are required to hold the last stored value.