Search code examples
cpointersconstants

Why can I change the value of a const char* variable?


Why does the following code in C work?

const char* str = NULL;
str = "test";
str = "test2";

Since str is a pointer to a constant character, why are we allowed to assign it different string literals? Further, how can we protect str from being modified? It seems like this could be a problem if, for example, we later assigned str to a longer string which ended up writing over another portion of memory.

I should add that in my test, I printed out the memory address of str before and after each of my assignments and it never changed. So, although str is a pointer to a const char, the memory is actually being modified. I wondered if perhaps this is a legacy issue with C?


Solution

  • You are changing the pointer, which is not const (the thing it's pointing to is const).

    If you want the pointer itself to be const, the declaration would look like:

    char * const str = "something";
    

    or

    char const * const str = "something";  // a const pointer to const char
    const char * const str = "something";  //    same thing
    

    Const pointers to non-const data are usually a less useful construct than pointer-to-const.