Home > database >  Why can't you have a non-const char* in C ?
Why can't you have a non-const char* in C ?

Time:12-05

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?

CodePudding user response:

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.

Source

CodePudding user response:

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";`

CodePudding user response:

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)

CodePudding user response:

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.

  • Related