La cadena literales se almacenan en el segmento de datos y se asignan en tiempo de compilación. Esto ayuda a asignar los mismos literales de cadena a múltiples variables sin crear copias de cadena.
e.g char * str = "hello";
str es el puntero de char, que tiene la dirección de char h, mientras que "hello" se almacena en el segmento de datos y no se puede modificar. Intentar modificarlo generará una falla de segmentación.
Al asignar una cadena de caracteres, la cadena literal crea una copia de la cadena en la pila.
i.e char str [] = "hello";
"hello" se copia a la pila (anexado por el carácter nulo) y str apunta al carácter 'h' en la pila.
+1. Dudo que incluso compile sin el calificador const. –
@BillyONeal: Sí. – missingfaktor
Recuerdo vagamente los perfiles de compilador de oldschool C que se rehúsan a compilar sin 'const'. –