Pergunta
Eu tenho o seguinte código:
char *array1[3] =
{
"hello",
"world",
"there."
};
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
Compila bem com "gcc -Wall -ansi -pedantic".Mas com outro conjunto de ferramentas (Rowley), ele reclama de
warning: initialization from incompatible pointer type
na linha em que char ** t é.Este é realmente um código ilegal ou está OK?
Obrigado por todas as respostas.Agora sei onde estava meu problema.No entanto, isso levanta uma nova questão:
Solução
Parece perfeitamente legal para mim;char *[3]
decai para char **
, então a atribuição deve ser válida.
Nem o GCC 4.4.5 nem o CLang 1.1 reclamam.
Outras dicas
Embora na prática array1
deva decair para um ponteiro do tipo char **
, seu tipo real é na verdade char *[3]
, daí o aviso.
Para suprimir o aviso, você pode tentar lançá-lo explicitamente:
...
(char **) array1;
...
array1 é (char *)[3]
, que é semanticamente diferente de char **
, embora na atribuição deva ser degradado normalmente para um char **
Ponteiros e matrizes e compatíveis apenas em escopo estático.No escopo global, um ponteiro e uma matriz não são iguais, misturar os dois resultará em um comportamento indefinido.Portanto, na minha opinião, o aviso está correto.
Tente colocar:
extern char *array1[3] =
{
"hello",
"world",
"there."
};
em um módulo e:
extern char **array1;
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
em outro, compilar e vincular.(Eu não tentei ...) Eu esperava que as coisas dessem errado ...