我正在学习测试,其中一个问题是实现像valgrind for Windows这样的系统。 我和我的同学们有兴趣做以下事情:
void* ptr = malloc(size);
int ptr_location = (int)ptr;
free( (void*) ptr_location);
原因是可以通过地图中的位置和大小轻松管理内存,而不是手持指针本身。
这些转化是否合法,有更好的方法吗?
答案 0 :(得分:4)
这是实现定义的行为。
引用C11
,章节§6.3.2.3/ p6,
任何指针类型都可以转换为整数类型。除非事先指明,否则 结果是实现定义的。如果结果无法以整数类型表示, 行为未定义。结果不必在任何整数的值范围内 类型。
相反,您可以使用§7.20.1.4中描述的intptr_t
或uintptr_t
(在<stdint.h>
中提供)
[...]类型指定具有任何有效属性的(n)(un)有符号整数类型 指向
void
的指针可以转换为此类型,然后转换回指向void
的指针, 并且结果将与原始指针进行比较。
答案 1 :(得分:2)
不确定您要问的是什么,但通常上述示例是错误的且不可移植,因为int
尺寸和void *
在不同平台上可能会有所不同。
如果你真的想将void *
转换为某种int类型,最好使用intptr_t
(或uintptr_t
)保证(至少)与void *
相同的大小。