将 int 类型转换为 char *
Typecasting int to char *
在我的一个头文件中定义了以下结构定义
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" ?
假设你希望函数对结构中的数组addr
做一些事情,那么就不需要强制转换了。只需传递 addr
成员:
hci_acl_connect(hsu_addr.addr, &cont_hand);
这是假设 UINT8
和 UCHAR
都是 unsigned char
的别名(这似乎是一个安全的假设)。
从任何其他指针类型转换为 char *
或 unsigned char *
是安全的,因为 char
具有最不严格的对齐要求,也就是说,它可以位于任何地址。它也不会违反严格的别名规则。
然而,相反的是未定义的行为。较大的类型通常会有更严格的对齐要求,这可能会导致尝试在未对齐的地址执行操作。新指针也可能是旧指针的别名,这可能会在进行优化时误导编译器。
当然可以。你的变量驻留在栈上,但你需要提供一个指针,所以你使用 &your_var
。你需要一个指向 UCHAR
的指针,所以你强制转换:(UCHAR *)&your_var
。
转换本身没问题,但我们不知道 UCHAR * bd_addr
应该代表什么。或许您应该传递 your_var.addr
?
在我的一个头文件中定义了以下结构定义
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" ?
假设你希望函数对结构中的数组addr
做一些事情,那么就不需要强制转换了。只需传递 addr
成员:
hci_acl_connect(hsu_addr.addr, &cont_hand);
这是假设 UINT8
和 UCHAR
都是 unsigned char
的别名(这似乎是一个安全的假设)。
从任何其他指针类型转换为 char *
或 unsigned char *
是安全的,因为 char
具有最不严格的对齐要求,也就是说,它可以位于任何地址。它也不会违反严格的别名规则。
然而,相反的是未定义的行为。较大的类型通常会有更严格的对齐要求,这可能会导致尝试在未对齐的地址执行操作。新指针也可能是旧指针的别名,这可能会在进行优化时误导编译器。
当然可以。你的变量驻留在栈上,但你需要提供一个指针,所以你使用 &your_var
。你需要一个指向 UCHAR
的指针,所以你强制转换:(UCHAR *)&your_var
。
转换本身没问题,但我们不知道 UCHAR * bd_addr
应该代表什么。或许您应该传递 your_var.addr
?