8

我有以下代码:

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

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

它可以使用“gcc -Wall -ansi -pedantic”编译。但是使用另一个工具链(Rowley),它抱怨

warning: initialization from incompatible pointer type

在 char **t 所在的行上。这确实是非法代码还是可以?

感谢所有的答案。我现在知道我的问题出在哪里了。然而,它提出了一个新问题:

字符串数组初始化

4

4 回答 4

4

对我来说似乎完全合法;char *[3]衰减到char **,所以赋值应该是有效的。

GCC 4.4.5 和 CLang 1.1 都没有抱怨。

于 2011-10-20T10:12:00.080 回答
2

尽管实际上array1应该衰减为 type 的指针char **,但它的真实类型实际上是char *[3],因此发出警告。

要抑制警告,您可以尝试显式转换它:

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

array1 is (char *)[3],它在语义上不同于char **,尽管在赋值中它应该被优雅地降级为char **

于 2011-10-20T10:13:08.250 回答
-1

指针和数组,仅在静态范围内兼容。在全局范围内,指针和数组是不相同的,将两者混合会导致未定义的行为。所以在我看来,警告是正确的。

尝试放置:

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

在一个模块中,并且:

extern char **array1;

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

在另一个,编译和链接。(我还没有尝试过......)我预计事情会出错......

于 2011-10-20T10:54:12.263 回答