类型转换为char *

时间:2016-07-20 07:26:06

标签: c structure typecasting-operator

以下结构定义在我的一个头文件

中定义
typedef struct REMDEV_ADDR {
UINT8    addr[DEVICE_ADDR_SIZE];
} RemDev_Addr;

typedef RemDev_Addr BTDEV_ADDR;

现在我有以下我想要使用的功能。

 hci_acl_connect(UCHAR *   bd_addr,UINT16 *  handle);

所以我在我的c文件中创建了上述结构的全局实例

BTDEV_ADDR hsu_addr

并像这样调用函数

hci_acl_connect((unsigned char *)&hsu_addr,&cont_hand);

类型转换是否正确“(unsigned char *)& hsu_addr”?

3 个答案:

答案 0 :(得分:2)

假设您希望函数对结构中的数组addr执行某些操作,则无需进行转换。只需传递addr成员:

hci_acl_connect(hsu_addr.addr, &cont_hand);

假设UINT8UCHAR都是unsigned char的别名(这似乎是一个安全的假设)。

答案 1 :(得分:1)

从任何其他指针类型转换为char *unsigned char *是安全的,因为char具有最不严格的对齐要求,也就是说,它可以位于任何地址。它也不会破坏严格的别名规则。

然而,逆是未定义的行为。较大的类型通常具有更严格的对齐要求,并且可能导致尝试在未对齐的地址处执行操作。新指针也可能是旧指针的别名,这可能会在进行优化时误导编译器。

答案 2 :(得分:1)

是的,当然。您的变量驻留在堆栈上,但您需要提供指针,因此您使用&your_var。你需要一个指向UCHAR的指针,所以你施放:(UCHAR *)&your_var

投射本身没问题,但我们不知道UCHAR * bd_addr应该代表什么。也许你应该通过your_var.addr而不是?