Attempting to modify a string literal causes undefined behavior:
char * p = "wikipedia";
p[0] = 'W'; // undefined behaviour
One way to prevent this is defining it as an array instead of a pointer:
char p[] = "wikipedia";
p[0] = 'W'; // ok
Why does char* cause undefined behaviour, while char[] doesn’t?
Any attempt to modify a C string literal has undefined behaviour. A compiler may arrange for string literals to be stored in read-only memory (protected by the OS, not literally ROM unless you’re on an embedded system). But the language doesn’t require this; it’s up to you as a programmer to get it right.
A sufficiently clever compiler could have warned you that you should have declared the pointer as:
though the declaration without the
constis legal in C (for the sake of not breaking old code). But with or without a compiler warning, theconstis a very good idea.(In C++, the rules are different; C++ string literals, unlike C string literals, really are
const.)When you initialize an array with a literal, the literal itself still exists in a potentially read-only region of your program image, but it is copied into the local array:
Note that
does not work — arrays can only be initialized from a brace initializer, and char arrays additionally from a string literal.char u[] = *p