8

私は次のコードを持っています:

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

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

「gcc-Wall-ansi-pedantic」でOKにコンパイルされます。しかし、別のツールチェーン(Rowley)では、

warning: initialization from incompatible pointer type

char**tが存在する行。これは本当に違法なコードですか、それとも大丈夫ですか?

すべての答えをありがとう。私は今、自分の問題がどこにあったかを知っています。しかし、それは新しい疑問を提起します:

文字列配列の初期化

4

4 に答える 4

4

私には完全に合法のようです。char *[3]に減衰するchar **ため、割り当ては有効である必要があります。

GCC4.4.5もCLang1.1も文句を言いません。

于 2011-10-20T10:12:00.080 に答える
2

実際にarray1は、型のポインタに減衰するはずchar **ですが、実際にはその実際の型であるchar *[3]ため、警告が表示されます。

警告を抑制するには、明示的にキャストしてみてください。

...
(char **) array1;
...
于 2011-10-20T10:11:58.873 に答える
1

array1は(char *)[3]、とは意味的に異なりchar **ますが、割り当てでは、適切に劣化させる必要があります。char **

于 2011-10-20T10:13:08.250 に答える
-1

ポインタと配列であり、静的スコープでのみ互換性があります。グローバルスコープでは、ポインタと配列は同じではありません。2つを混在させると、未定義の動作が発生します。だから私の意見では、警告は正しいです。

入れてみてください:

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

1つのモジュールで:

extern char **array1;

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

別の方法では、コンパイルしてリンクします。(私はそれを試していません…)私は物事がうまくいかないことを期待します...

于 2011-10-20T10:54:12.263 に答える