如何解决将char *转换为int内存地址
我有:
char* mem = (char*) 0xB8000;
然后mem
传递给一个函数。在函数内部,我想找回数字0xB8000
并将其与其他一些整数进行比较。如何将mem
转换回原始整数?
解决方法
要将任何指针转换为整数,请执行以下操作:
#include <stdint.h>
uintptr_t ptr_to_integer(const void *ptr) {
return (uintptr_t) ptr;
}
请注意,uintptr_t
的大小可能会因平台而异。而且,这是C标准的可选部分,因此从技术上讲,只有uintmax_t
是绝对可移植的。
如何将mem转换回原始整数?
通常强制转换为(u)intptr_t
会形成原始整数。
include <stdint.h>
printf("o: %lX\n",0xB8000LU);
char* mem = (char*) 0xB8000;
printf("mem %p\n",(void *) mem);
uintptr_t i = (uintptr_t) mem;
printf("i: %jX\n",(uintmax_t) i);
陷阱
C未指定从(u)intptr_t
到void *
到uintptr_t
的往返(或任何整数类型)以产生原始值。即使将void *
到(u)intptr_t
到void *
也仅指定为返回等价指针,而不必返回相同的指针位模式。
没有将像(char*) 0xB8000
这样的任意数字投射到指针上。
“结果是实现定义的,可能未正确对齐,可能未指向所引用类型的实体,并且可能是陷阱表示形式” C17dr 6.3.2.3 5
(u)intptr_t
是可选类型-尽管很常见。兼容库可能无法提供类型。
没有(u)intptr_t
的相应打印说明符。一个合理的解决方法是隐瞒最广泛的可用类型和打印内容。
我想找回数字0xB8000并将其与其他一些整数进行比较。
更好的方法是将“其他整数”隐藏到char *
中并比较指针。
最适合OP发布较大的代码使用量以处理总体目标。
请谨慎操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。