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]whereNis the number of characters including the terminating\0. So yes you can assign them tochar*, 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.