Frage

Ich habe den folgenden Code:

char *array1[3] = 
{
    "hello",
    "world",
    "there."
};

struct locator_t
{
    char **t;
    int len;
} locator[2] =
{
    {
        array1,
        10
    }
};

Es wird OK mit "gcc -Wall -ansi -pedantic" kompiliert.Aber mit einer anderen Toolchain (Rowley) beschwert es sich über

warning: initialization from incompatible pointer type

in der Zeile, in der char ** t steht.Ist das tatsächlich illegaler Code oder ist es in Ordnung?

Danke für die Antwort.Ich weiß jetzt, wo mein Problem war.Es wirft jedoch eine neue Frage auf:

Initialisierung des String-Arrays

War es hilfreich?

Lösung

Scheint mir vollkommen legal zu sein;char *[3] zerfällt in char **, daher sollte die Zuordnung gültig sein.

Weder GCC 4.4.5 noch CLang 1.1 beschweren sich.

Andere Tipps

Obwohl in der Praxis array1 in einen Zeiger vom Typ char ** zerfallen sollte, ist sein realer Typ tatsächlich char *[3], daher die Warnung.

Um die Warnung zu unterdrücken, können Sie versuchen, sie explizit zu übertragen:

...
(char **) array1;
...

array1 ist (char *)[3], der sich semantisch von char ** unterscheidet, obwohl er in der Zuweisung ordnungsgemäß zu einem char ** herabgesetzt werden sollte

Zeiger und Arrays und nur im statischen Bereich kompatibel.Im globalen Bereich sind ein Zeiger und ein Array nicht identisch. Das Mischen der beiden führt zu einem undefinierten Verhalten.Meiner Meinung nach ist die Warnung also richtig.

Versuchen Sie Folgendes:

extern char *array1[3] = 
{
    "hello",
    "world",
    "there."
};

in einem Modul und:

extern char **array1;

struct locator_t
{
    char **t;
    int len;
} locator[2] =
{
    {
        array1,
        10
    }
};

in einem anderen kompilieren und verknüpfen.(Ich habe es nicht ausprobiert ...) Ich würde erwarten, dass etwas schief geht ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top