问题
I have the following code:
char *array1[3] =
{
"hello",
"world",
"there."
};
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
It compiles OK with "gcc -Wall -ansi -pedantic". But with another toolchain (Rowley), it complains about
warning: initialization from incompatible pointer type
on the line where char **t is. Is this indeed illegal code or is it OK?
Thanks for all the answer. I now know where my problem was. However, it raises a new question:
string array initialisation
回答1:
Seems perfectly legal to me; char *[3]
decays to char **
, so the assignment should be valid.
Neither GCC 4.4.5 nor CLang 1.1 complains.
回答2:
Although in practice array1
should decay to a pointer of type char **
, its real type is in fact char *[3]
, hence the warning.
To suppress the warning, you could try casting it explicitly:
...
(char **) array1;
...
回答3:
array1 is (char *)[3]
, which is semantically different from char **
, although in the assignment it should be gracefully degraded to a char **
回答4:
Pointers and arrays and only compatible in static scope. In global scope a pointer and an array are not the same, mixing the two will result in undefined behavior. So in my opinion, the warning is correct.
Try putting:
extern char *array1[3] =
{
"hello",
"world",
"there."
};
in one module and:
extern char **array1;
struct locator_t
{
char **t;
int len;
} locator[2] =
{
{
array1,
10
}
};
in another, compile and link. (I haven't tried it…) I would expect things to go wrong...
来源:https://stackoverflow.com/questions/7834294/string-array-conversion