преобразование массива строк - PullRequest
8 голосов
/ 20 октября 2011

У меня есть следующий код:

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 голосов
/ 20 октября 2011

мне кажется вполне законным;char *[3] уменьшается до char **, поэтому назначение должно быть действительным.

Ни GCC 4.4.5, ни CLang 1.1 не жалуются.

2 голосов
/ 20 октября 2011

Хотя на практике array1 должен затухать до указателя типа char **, его реальный тип на самом деле char *[3], отсюда и предупреждение.

Чтобы подавить предупреждение, вы можете попробовать привести его явно:

...
(char **) array1;
...
1 голос
/ 20 октября 2011

array1 равно (char *)[3], что семантически отличается от char **, хотя в назначении оно должно быть изящно понижено до char **

0 голосов
/ 20 октября 2011

Указатели и массивы и совместимы только в статической области видимости. В глобальной области видимости указатель и массив не одинаковы, смешивание двух приведет к неопределенному поведению. Так что, на мой взгляд, предупреждение верно.

Попробуйте поставить:

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

в одном модуле и:

extern char **array1;

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

в другом, скомпилировать и связать. (Я не пробовал это ...) Я ожидал, что что-то пойдет не так ...

...