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