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:

inicialização da matriz de string

Foi útil?

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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top