Inicializador de cadena literal para una matriz de caracteres

En las siguientes reglas para el caso cuando la matriz se descompone en puntero:

Un lvalue [ver pregunta 2.5] de tipo array-of-T que aparece en una expresión decae (con tres excepciones) en un puntero a su primer elemento; el tipo del puntero resultante es puntero-a-T.

(Las excepciones son cuando la matriz es el operando de un operador sizeof o &, o es un inicializador de cadena literal para una matriz de caracteres.)

¿Cómo entender el caso cuando la matriz es “inicializador de cadena literal para una matriz de caracteres”? Por ejemplo, por favor.

¡Gracias!

Las tres excepciones en las que una matriz no decae en un puntero son las siguientes:

Excepción 1. – Cuando la matriz es el operando de sizeof .

 int main() { int a[10]; printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */ int* p = a; printf("%zu", sizeof(p)); /* prints sizeof(int*) */ } 

Excepción 2. – Cuando la matriz es el operando del operador & .

 int main() { int a[10]; printf("%p", (void*)(&a)); /* prints the array's address */ int* p = a; printf("%p", (void*)(&p)); /*prints the pointer's address */ } 

Excepción 3. – Cuando la matriz se inicializa con una cadena literal.

 int main() { char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */ char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */ } 

Asume las declaraciones

 char foo[] = "This is a test"; char *bar = "This is a test"; 

En ambos casos, el tipo del literal de cadena ” This is a test ” es “array de 15 elementos de char”. En la mayoría de las circunstancias, las expresiones de matriz se convierten implícitamente de tipo “matriz de elementos N de T” a “puntero a T”, y la expresión se evalúa como la dirección del primer elemento de la matriz. En la statement de bar , eso es exactamente lo que sucede.

En la statement para foo , sin embargo, la expresión se está utilizando para inicializar el contenido de otra matriz y, por lo tanto, no se convierte en un tipo de puntero; en su lugar, el contenido del literal de cadena se copia a foo .

Este es un inicializador de cadena literal para una matriz de caracteres:

 char arr[] = "literal string initializer"; 

También podría ser:

 char* str = "literal string initializer"; 

Definición de K y R2:

Un literal de cadena, también llamado constante de cadena, es una secuencia de caracteres rodeada de comillas dobles como en “…”. Una cadena tiene el tipo “ matriz de caracteres ” y la clase de almacenamiento estática (vea el párrafo A más abajo) y se inicializa con los caracteres dados. Si los literales de cadena idénticos son distintos está definido por la implementación, y el comportamiento de un progtwig que intenta alterar una cadena literal no está definido.

Parece que sacó esa cita de las preguntas frecuentes sobre comp.lang.c (quizás una versión anterior o tal vez la versión impresa, pero no concuerda con el estado actual de la versión en línea):

http://c-faq.com/aryptr/aryptrequiv.html

La sección correspondiente se vincula a otras secciones de las preguntas frecuentes para explicar esas excepciones. En tu caso, deberías mirar:

http://c-faq.com/decl/strlitinit.html