如何使用其地址作为整数的实际值,正确地将一个文字整数作为参数传递给void指针

时间:2013-11-05 15:27:40

标签: c++ casting void-pointers

作为实验:

我有一个带签名的假设函数:void func(void *),我必须在代码中传递一个整数值:func(42)必须使用文字整数

是否有一种“正确”的方式来传递一个整数值,例如,“黑客”作为指针中的地址(例如地址为0x2A),并以某种方式将其转换回整数(对于0x2A示例为42) )。所有这些都没有出现意外行为?

简而言之:能够将指针地址转换为一个保存地址编号的整数。

2 个答案:

答案 0 :(得分:4)

C和C ++标准都明确允许这种转换。

C99 6.3.2.3.5:

  

整数可以转换为任何指针类型。除非事先指明,否则   结果是实现定义的,可能没有正确对齐,可能不指向   引用类型的实体,可能是陷阱表示。

C ++ 11 5.2.10.5

  

可以将整数类型或枚举类型的值显式转换为指针。

因此,您对func((void*)42)的调用应适用于所有符合标准的编译器。

  

将文字整数传递给期望空指针的参数,并且在函数中保持整数不变的最正确方法是什么?

这种将文字整数作为参数传递给期望void*的函数的方法可以保证原始整数在函数中不受影响,因为参数是按值传递的。

答案 1 :(得分:1)

不应该这样做。

您可以在堆栈上分配值,然后调用该函数。

C:

中的示例
int i = 42;
func((void*) (&i));

C ++中的示例:

int i = 42;
func(reinterpret_cast<void*> (&i));

否则,如果您不确定变量的生命周期,可以使用 malloc()/ free() new / delete