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:

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top