Question
Je le code suivant:
char *array1[3] =
{
"hello",
"world",
"there."
};
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
Il compile OK avec "gcc -Wall -ansi -pedantic". Mais avec un autre toolchain (Rowley), il se plaint de
warning: initialization from incompatible pointer type
sur la ligne où char ** t est. Est-ce code illégal ou bien est-il OK?
Merci pour la réponse. Je sais maintenant où était mon problème. Cependant, il soulève une nouvelle question:
La solution
Il semble parfaitement légal pour moi; désintégrations char *[3]
à char **
, de sorte que l'affectation doit être valide.
Ni GCC 4.4.5, ni Clang 1.1 se plaint.
Autres conseils
Bien que dans la pratique array1
devrait se désintégrer à un pointeur de type char **
, son type réel est en fait char *[3]
, d'où l'avertissement.
Pour supprimer l'avertissement, vous pouvez essayer de le jeter explicitement:
...
(char **) array1;
...
matrice1 est (char *)[3]
, qui est sémantiquement différent de char **
, bien que dans l'affectation, il devrait être dégradé grâce à un char **
Pointeurs et tableaux et compatibles uniquement une portée statique. Portée mondiale un pointeur et un tableau ne sont pas les mêmes, le mélange des deux se traduira par un comportement non défini. Donc, à mon avis, l'avertissement est correct.
Essayez de mettre:
extern char *array1[3] =
{
"hello",
"world",
"there."
};
dans un module et:
extern char **array1;
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
dans un autre, compilez et lien. (Je ne l'ai pas essayé ...) J'attendre que les choses vont mal ...