我可以将void*转换为char[]吗?这是非法的吗?我只想看一下位。我知道intptr_t,但我宁愿不使用在给定平台上可能存在也可能不存在的typedef。
void*
char[]
intptr_t
wlzqhblo1#
我可以将指针转换为char吗?是的,但这只在深奥的情况下有用,例如检查低位以查看对齐情况。我可以将void* 转换为char[]吗?还是这是非法的?转换为char []违反了C 2018 6.5.4 2中转换运算符的约束:除非型别名称指定void型别,否则型别名称应该指定不可部分完成、限定或非限定标量型别,而且算子应该具有标量型别。char []不是这些标量类型中的任何一种。您可以强制转换为char *,但这样不会给予指针的字节数;它会给予你指向char的指针。我知道intptr_t,但我不想使用typedef,因为它在给定的平台上可能存在,也可能不存在。uintptr_t通常比intptr_t更可取,以避免符号引起的复杂化。在少数C实现中,它不存在。然而,也可能有一些。为此,你可以不转换指针,而是将指针的地址转换为unsigned char *。这将给予你一个指向指针字节的新指针,然后你可以用它来检查那些字节。同样,最好使用无符号类型unsigned char *,以避免符号带来的复杂性。
char []
char *
char
uintptr_t
unsigned char *
1条答案
按热度按时间wlzqhblo1#
我可以将指针转换为char吗?
是的,但这只在深奥的情况下有用,例如检查低位以查看对齐情况。
我可以将void* 转换为char[]吗?还是这是非法的?
转换为
char []
违反了C 2018 6.5.4 2中转换运算符的约束:除非型别名称指定void型别,否则型别名称应该指定不可部分完成、限定或非限定标量型别,而且算子应该具有标量型别。
char []
不是这些标量类型中的任何一种。您可以强制转换为
char *
,但这样不会给予指针的字节数;它会给予你指向char
的指针。我知道intptr_t,但我不想使用typedef,因为它在给定的平台上可能存在,也可能不存在。
uintptr_t
通常比intptr_t
更可取,以避免符号引起的复杂化。在少数C实现中,它不存在。然而,也可能有一些。为此,你可以不转换指针,而是将指针的地址转换为
unsigned char *
。这将给予你一个指向指针字节的新指针,然后你可以用它来检查那些字节。同样,最好使用无符号类型unsigned char *
,以避免符号带来的复杂性。