¿Cómo se comstackn los literales de cuerdas en C?

¿Cómo se comstackn los literales de cuerdas en C? Según mi entendimiento, en la prueba 1, la cadena “hola” se coloca en el segmento de datos por comstackdor y en la segunda línea p se asigna esa dirección virtual codificada. ¿Es esto correcto? y que no hay una diferencia básica entre cómo funciona test1 y cómo funciona test2.

Algún código:

#include  test1(); test2(); test3(); main() { test1(); test2(); //test3(); } test1() { char *p; p="hello"; } test2() { char *p="hello"; } test3() { char *p; strcpy(p,"hello"); } 

Cualquier referencia del estándar C será muy apreciada, de modo que pueda entender esto en profundidad desde el punto de vista del comstackdor.

Desde el punto de vista estándar de C, no hay ningún requisito en particular acerca de dónde se colocará la cadena literal. Los únicos requisitos sobre el almacenamiento de literales de cadena se encuentran en C99 6.4.5 / 5 “literales de cadena”:

  • “una matriz de duración y longitud de almacenamiento estático suficiente para contener la secuencia”, lo que significa que el literal tendrá una vida útil tan larga como el progtwig.
  • “No se especifica si estas matrices son distintas siempre que sus elementos tengan el valor apropiado”, lo que significa que los diversos literales "hello" en su ejemplo pueden o no tener la misma dirección. No se puede contar con ningún comportamiento.
  • “Si el progtwig intenta modificar dicha matriz, el comportamiento es indefinido”, lo que significa que no puede cambiar la cadena literal. Una de las muchas plataformas se aplica (si intenta hacerlo, el progtwig se bloqueará). En algunas plataformas, el cambio puede parecer que funciona, por lo que no se puede contar con que el error sea evidente.

Su comprensión es correcta, los datos de “Hola” se colocarán en un segmento RO y su dirección virtual relativa se asignará a los punteros en las funciones testX ().

Sin embargo, esas son perspectivas específicas del comstackdor, el estándar C no se preocupa por ellas.

EDIT: Según test3 (), vea el comentario de τεκ.