You are not logged in.
Well, yes it is constant; it's a literal string! Your pointer to it is not constant, and you've defined it so that it looks as if it's not pointing to constant memory; but, your initializing it to a string literal does indeed point it at a constant value that can't be changed... (On some compilers, anyway... Some will let you actually modify string literals, which I think is a pretty broken behavior... Yours obviously stores them in a memory region with no write permission, which causes the seg-fault...)
What you probably wanted instead was:
char p = "hello";
Instead of defining a simple pointer and setting it to point at the constant string literal, that defines a stack buffer and initializes its contents with "hello" followed by a '\0'... Then, you'd be able to modify the buffer contents, because it's all on your stack... The string literal here is only used to initialize the starting contents of the buffer...
Alternatively, if you really wanted the pointer version, you could do:
char *p = strdupa ("hello");
That would also give you a stack-based copy of the string literal... Or, you could use regular strdup() to get a dynamic heap-based copy...