Предупреждение о присвоении из несовместимого типа указателя при использовании указателей и массивов? - PullRequest
4 голосов
/ 04 февраля 2011

Для struct

typedef struct sharedData
{
    sem_t *forks;
}sharedData;

я получаю предупреждение, когда пытаюсь сделать это:

sharedData sd;
sem_t forks[5];
sd.forks = &forks; // Warning: assignment from incompatible pointer type

Я что-то недопонимаю или что-то упустил?

Ответы [ 2 ]

11 голосов
/ 04 февраля 2011

Проблема в том, что &forks имеет тип

sem_t (*)[5]

То есть указатель на массив из пяти sem_t с. Предупреждение компилятора вызвано тем, что sd.forks имеет тип sem_t*, а два типа указателей не могут быть преобразованы друг в друга.

Чтобы это исправить, просто измените назначение на

sd.forks = forks;

Из-за взаимозаменяемости C / указателя массива этот код будет работать как задумано. Это потому, что forks будет рассматриваться как &forks[0], который имеет тип sem_t *.

1 голос
/ 07 июля 2013

Выше приведено отличное объяснение, но помните, что

sd.forks = forks;

- это то же самое, что и ....

sd.forks = &forks[0];

Мне нравится второй для ясности.Если вы хотите, чтобы указатель указывал на третий элемент ...

sd.forks = &forks[2];
...