Pregunta
Tengo el siguiente código:
char *array1[3] =
{
"hello",
"world",
"there."
};
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
Se compila bien con "gcc -Wall -ansi -pedantic".Pero con otra cadena de herramientas (Rowley), se queja
warning: initialization from incompatible pointer type
en la línea donde se encuentra char ** t.¿Es este código realmente ilegal o está bien?
Gracias por toda la respuesta.Ahora sé dónde estaba mi problema.Sin embargo, plantea una nueva pregunta:
Solución
Me parece perfectamente legal;char *[3]
decae a char **
, por lo que la asignación debería ser válida.
Ni GCC 4.4.5 ni CLang 1.1 se quejan.
Otros consejos
Aunque en la práctica array1
debería decaer a un puntero de tipo char **
, su tipo real es de hecho char *[3]
, de ahí la advertencia.
Para suprimir la advertencia, puede intentar transmitirla explícitamente:
...
(char **) array1;
...
array1 es (char *)[3]
, que es semánticamente diferente de char **
, aunque en la asignación debería ser degradado elegantemente a char **
Punteros y matrices y solo compatible en alcance estático.En el ámbito 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.
Intente 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 vincular.(No lo he probado ...) Esperaría que las cosas salieran mal ...