2011-02-04 2 views
4

Для structПредупреждение о назначении из несовместимого типа указателя при использовании указателей и массивов?

typedef struct sharedData 
{ 
    sem_t *forks; 
}sharedData; 

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

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

ли я недопонимание или что-то отсутствует?

ответ

11

Проблема заключается в том, что &forks имеет тип

sem_t (*)[5] 

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

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

sd.forks = forks; 

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

1

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

sd.forks = forks; 

такая же, как ....

sd.forks = &forks[0]; 

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

sd.forks = &forks[2]; 
Смежные вопросы