присвоение из несовместимого типа указателя: форсирование типа? - PullRequest
0 голосов
/ 11 января 2019
struct my_struct {
   int p;
   uint32_t *a;
   ...
};
struct my_struct *aa;

...

struct b {
   uint8_t b;
   ...
};
struct b *bb;

В этот момент bb и aa были инициализированы, bb содержит допустимые значения.

aa->a = &bb->b;

Однако это вызывает предупреждение компилятора, что имеет смысл:

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]

Безопасно ли делать следующее?

aa->a = (uint32_t *)&bb->b;

1 Ответ

0 голосов
/ 11 января 2019

Безопасно ли делать следующее?

aa->a = (uint32_t *)&bb->b;

C позволяет конвертировать между различными типами указателей объекта. А преобразовав значение выражения &bb->b в тип aa->a, вы, безусловно, можете присвоить результат aa->a. В этом смысле само это утверждение безопасно.

Но не безопасен для последующего разыменования aa->a. Результат этого явно не определен. Поскольку я делаю вывод, что это то, что вы собираетесь делать дальше, нет, ваш общий план небезопасен.

Если вам нужен указатель, который может указывать либо на uint32_t, либо на uint8_t, то используйте void *, либо char *, либо unsigned char *. В очень вероятном случае, когда uint8_t является псевдонимом для unsigned char, вы также можете использовать uint8_t *.

...