8

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
  • on wich line appears the problem ? Commented Oct 20, 2011 at 10:09

4 Answers 4

4

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.

Sign up to request clarification or add additional context in comments.

Comments

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;
...

Comments

1

array1 is (char *)[3], which is semantically different from char **, although in the assignment it should be gracefully degraded to a char **

Comments

-1

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...

2 Comments

Your first module doesn't compile because you can't declare a variable extern and initialize it in one statement. If you fix that, you might get linker errors because the declared types don't match.
Funny, my first module compiles with warnings but the seconds doesn't for the same reason as original question… That was a quick flash that went wrong, I wanted to underline the difference between arrays and pointers in global scope.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.