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;
答案 0 :(得分:2)
执行以下操作安全吗?
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 *
。