Domanda
Ho il seguente codice:
char *array1[3] =
{
"hello",
"world",
"there."
};
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
Compila OK con "gcc -Wall -ansi -pedantic".Ma con un'altra toolchain (Rowley), si lamenta
warning: initialization from incompatible pointer type
sulla riga dove si trova char ** t.Questo codice è davvero illegale o va bene?
Grazie per tutte le risposte.Ora so dov'era il mio problema.Tuttavia, solleva una nuova domanda:
Soluzione
Mi sembra perfettamente legale;char *[3]
decade in char **
, quindi l'assegnazione dovrebbe essere valida.
Né GCC 4.4.5 né CLang 1.1 si lamentano.
Altri suggerimenti
Anche se in pratica array1
dovrebbe decadere in un puntatore di tipo char **
, il suo tipo reale è in realtà char *[3]
, da cui l'avviso.
Per sopprimere l'avviso, potresti provare a trasmetterlo esplicitamente:
...
(char **) array1;
...
array1 è (char *)[3]
, che è semanticamente diverso da char **
, sebbene nell'assegnazione dovrebbe essere gradualmente degradato a char **
Puntatori e array e compatibili solo in ambito statico.Nell'ambito globale un puntatore e un array non sono la stessa cosa, mescolare i due comporterà un comportamento indefinito.Quindi, a mio parere, l'avviso è corretto.
Prova a inserire:
extern char *array1[3] =
{
"hello",
"world",
"there."
};
in un modulo e:
extern char **array1;
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
in un altro, compila e collega.(Non l'ho provato ...) Mi aspetto che le cose vadano male ...