Reputation: 1006
Why does this work:
char foo[6] = "shock";`
while this does not work:
char* bar = "shock"; //error
Why does bar
have to be const
while foo
doesn't? Arrays in C decay to pointers, so don't foo
and bar
technically have the same types?
Upvotes: 2
Views: 727
Reputation: 48635
With this declaration:
char foo[6] = "shock";
Variable foo
is type array of char and it containes 6 non-const chars. The string literal contains const chars which are copied into the array on initialization.
While with this declaration:
char* bar = "shock"; //error
Variable bar
is type pointer to char. You are trying to make it point to the address of "shock"
which is a string literal containing const char
.
You can't point a pointer to non-const char at a const char.
So you must do this:
const char* bar = "shock";`
Upvotes: 7
Reputation: 1196
Literals are held in reserved areas of memory that are not supposed to be changed by code. Changing the value held at the address storing that literal would mean that every time any other code tried to use that literal, it would find the wrong value in that memory. So it is illegal to modify that memory, and hence illegal to treat it as not constant.
Upvotes: 7
Reputation: 31409
char* bar = "shock";
is roughly equivalent to
const char anonymousArray[6] = "shock";
char *bar = anonymousArray;
Arrays decays to pointers. That's not the same as actually being pointers.
Upvotes: 1
Reputation: 50190
because "shock" is a constant, so a pointer to it must be const
for historical reasons C allows this (and causes many errors that lead to SO posts)
Upvotes: 3