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:

inizializzazione dell'array di stringhe

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top