将void *转换为int和back

时间:2016-07-18 08:03:18

标签: c pointers integer type-conversion

我正在学习测试,其中一个问题是实现像valgrind for Windows这样的系统。 我和我的同学们有兴趣做以下事情:

void* ptr = malloc(size);
int ptr_location = (int)ptr;
free( (void*) ptr_location);

原因是可以通过地图中的位置和大小轻松管理内存,而不是手持指针本身。

这些转化是否合法,有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

这是实现定义的行为。

引用C11,章节§6.3.2.3/ p6,

  

任何指针类型都可以转换为整数类型。除非事先指明,否则   结果是实现定义的。如果结果无法以整数类型表示,   行为未定义。结果不必在任何整数的值范围内   类型。

相反,您可以使用§7.20.1.4中描述的intptr_tuintptr_t(在<stdint.h>中提供)

  

[...]类型指定具有任何有效属性的(n)(un)有符号整数类型   指向void的指针可以转换为此类型,然后转换回指向void的指针,   并且结果将与原始指针进行比较。

答案 1 :(得分:2)

不确定您要问的是什么,但通常上述示例是错误的且不可移植,因为int尺寸和void *在不同平台上可能会有所不同。

如果你真的想将void *转换为某种int类型,最好使用intptr_t(或uintptr_t)保证(至少)与void *相同的大小。