我有以下代码:
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的行上。这确实是非法的代码还是没问题?
感谢所有答案。我现在知道我的问题在哪里。然而,它提出了一个新问题:
答案 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
}
};
在另一个,编译和链接。 (我没试过......)我希望事情出错...