从不兼容的指针类型分配:强制类型?

时间:2019-01-10 22:12:19

标签: c pointers assignment-operator

struct my_struct {
   int p;
   uint32_t *a;
   ...
};
struct my_struct *aa;

...

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

此时bbaa已被初始化,bb包含有效值。

aa->a = &bb->b;

但这会引起编译器警告,这很有意义:

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

执行以下操作安全吗?

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

1 个答案:

答案 0 :(得分:2)

  

执行以下操作安全吗?

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

C允许您在不同的对象指针类型之间进行转换。将表达式&bb->b的值转换为aa->a的类型后,您当然可以将结果分配给aa->a。从这个意义上说,该语句本身是安全的。

但是随后取消引用aa->a不安全的。这样做的结果是明确未定义的。据我推测,这就是您接下来要做的,不,您的总体计划并不安全。

如果您想要一个可以指向uint32_tuint8_t的指针,请使用void *char *unsigned char *。如果uint8_tunsigned char的别名,您也可以使用uint8_t *