Literales de cadenas del progtwig C

Cuando hacemos

char *p ="house"; p = 'm'; 

No está permitido.

Pero cuando lo hacemos

  char p[] = "house"; p[0] = 'm'; printf(p); 

Da O / P como: ratón

¿No puedo entender cómo y dónde C asigna memoria para literales de cadena?

char p[] = "house";

"house" es un literal de cadena almacenado en una ubicación de solo lectura, pero p es una matriz de caracteres colocados en la stack en la que se copia "house" .

Sin embargo, en char *p = "house"; , p realidad apunta a la ubicación de solo lectura que contiene la cadena literal “casa”, por lo que modificarla es UB.

Una nota de la 6.7.8 Initialization estándar 6.7.8 Initialization

14 Una serie de caracteres puede inicializarse mediante un literal de cadena de caracteres, opcionalmente encerrado entre llaves. Los caracteres sucesivos del literal de la cadena de caracteres (incluido el carácter nulo de terminación si hay espacio o si la matriz es de tamaño desconocido) inicializan los elementos de la matriz.

Así que básicamente tienes una gran variedad de personajes. No debería ser tan difícil o desconcertar al comprender cómo se modifica esta matriz si ha utilizado matrices de ints , floats , etc.

Cuando usas char * p = “house”: el comstackdor recostack todas las cadenas de “house” y las coloca en un espacio de solo lectura.

Cuando se usa char p [] = “house”, el comstackdor crea espacio para la cadena como una matriz en el ámbito local.

La diferencia básica es que 1000 puntos de puntero podrían compartir el primero (por lo que no se puede modificar) y el segundo es local para el scope, por lo que siempre que sea del mismo tamaño, es modificable.

 char *p = "house"; // const char* p = "house"; 

La cadena "house" literal reside en la ubicación de solo lectura y no se puede modificar. Ahora lo que estás haciendo es –

 *p = 'm' ; // trying to modify read-only location; Missed the dereferencing part 

Ahora,

 char p[] = "house"; 

"house" se copia en la matriz p. Por lo tanto, su contenido es modificable. Entonces, esto realmente funciona.

 p[0] = 'm'; // assigning `m` at 0th index.