2011-10-20 25 views
8

Tengo el siguiente código:cadena matriz de conversión

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

struct locator_t 
{ 
    char **t; 
    int len; 
} locator[2] = 
{ 
    { 
     array1, 
     10 
    } 
}; 

Compila bien con "gcc -Wall -ansi -pedantic". Pero con otra cadena de herramientas (Rowley), que se queja de

warning: initialization from incompatible pointer type 

en la línea donde char ** t es. ¿Es este código realmente ilegal o está bien?

Gracias por la respuesta. Ahora sé dónde estaba mi problema. Sin embargo, plantea una nueva pregunta:

string array initialisation

+0

¿En qué línea aparece el problema? –

+0

pregunta editada. – lang2

Respuesta

4

parece perfectamente legal para mí; char *[3] se descompone en char **, por lo que la asignación debe ser válida.

Ni GCC 4.4.5 ni CLang 1.1 se queja.

2

Aunque en la práctica array1 debe decaer a un puntero de tipo char **, su verdadero tipo es, de hecho, char *[3], de ahí la advertencia.

Para suprimir la advertencia, usted podría tratar de fundición explícitamente:

... 
(char **) array1; 
... 
1

array1 es (char *)[3], que es semánticamente diferente de char **, aunque en la asignación debe ser elegantemente degradada a una char **

-1

Punteros y arrays y sólo compatible en su alcance estática. En el alcance global, un puntero y una matriz no son lo mismo, mezclar los dos dará como resultado un comportamiento indefinido. Entonces, en mi opinión, la advertencia es correcta.

trate de poner:

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

en un módulo y:

extern char **array1; 

struct locator_t 
{ 
    char **t; 
    int len; 
} locator[2] = 
{ 
    { 
     array1, 
     10 
    } 
}; 

en otro, compilar y enlazar. (No lo he intentado ...) Esperaría que las cosas salieran mal ...

+0

Su primer módulo no se compila porque no puede declarar una variable 'extern' e inicializarla en una declaración. Si arregla eso, es posible que obtenga errores del enlazador porque los tipos declarados no coinciden. –

+0

Es curioso, mi primer módulo compila con advertencias pero los segundos no son por la misma razón que la pregunta original ... Eso fue un destello rápido que salió mal, quería subrayar la diferencia entre arreglos e indicadores en el alcance global. –

Cuestiones relacionadas