字符串数组转换

时间:2011-10-20 10:04:45

标签: c ansi-c

我有以下代码:

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的行上。这确实是非法的代码还是没问题?

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

string array initialisation

4 个答案:

答案 0 :(得分:4)

对我来说似乎完全合法; char *[3]衰减到char **,因此作业有效。

GCC 4.4.5和CLang 1.1都没有抱怨。

答案 1 :(得分:2)

虽然在实践中array1应该衰减为char **类型的指针,但其实际类型实际上是char *[3],因此警告。

要取消警告,您可以尝试明确地将其强制转换:

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

答案 2 :(得分:1)

array1是(char *)[3],它在语义上与char **不同,但在分配中它应该优雅地降级为char **

答案 3 :(得分:-1)

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

尝试推杆:

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

在一个模块中:

extern char **array1;

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

在另一个,编译和链接。 (我没试过......)我希望事情出错...