2011-10-20 20 views
10

Esta es la continuación de otra question que tengo.inicialización del conjunto de cadenas

Considere el siguiente código:

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

No compila para mi sorpresa (al parecer no sé la sintaxis de C, así como yo pensaba) y genera el siguiente error:

error: initializer element is not constant 

Si cambio la char * a char [] se compila bien:

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

Puede alguien explicarme por qué?

Respuesta

6

En el primer ejemplo (char *hi = "hello";), está creando un puntero no const que se inicializa para apuntar a la cadena estática const "hello". Este puntero podría, en teoría, señalar lo que quieras.

En el segundo ejemplo (char hi[] = "hello";) está definiendo específicamente una matriz, no un puntero, por lo que la dirección a la que hace referencia no es modificable. Tenga en cuenta que una matriz se puede considerar como un puntero no modificable para un bloque específico de memoria.

Su primer ejemplo realmente se compila sin problemas en C++ (mi compilador, al menos).

+1

gracias. ¿Hay alguna manera de usar la palabra clave const para hacer que la primera pieza de código funcione? – lang2

+1

@ lang2 No en ese alcance. Ver esto [C FAQ] (http://c-faq.com/ansi/constasconst.html). Ni siquiera con 'char * const hi' (puntero constante a char). – cnicutar

+0

Acabo de agregar algo, aunque no estoy seguro de si funcionará ... su primera versión compila OK en C++ - Lo intentaré con un compilador de C cuando tenga un momento :) – icabod

Cuestiones relacionadas