作为一个实验:
我有带有签名的假设函数:void func(void *)
,我必须在代码中传递一个整数值:func(42)
。必须使用文字整数来完成。
是否有一种“正确”的方式来传递一个整数值,例如,“破解”作为指针中的地址(例如指向地址 0x2A),然后以某种方式将其转换回整数(对于 0x2A 示例为 42)。所有这一切都没有意外的行为?
简而言之:能够将指针地址转换为将保存地址编号的整数。
作为一个实验:
我有带有签名的假设函数:void func(void *)
,我必须在代码中传递一个整数值:func(42)
。必须使用文字整数来完成。
是否有一种“正确”的方式来传递一个整数值,例如,“破解”作为指针中的地址(例如指向地址 0x2A),然后以某种方式将其转换回整数(对于 0x2A 示例为 42)。所有这一切都没有意外的行为?
简而言之:能够将指针地址转换为将保存地址编号的整数。
C 和 C++ 标准都明确允许这种转换。
C99 6.3.2.3.5:
整数可以转换为任何指针类型。除非前面指定,结果是实现定义的,可能没有正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。
C++11 5.2.10.5
整数类型或枚举类型的值可以显式转换为指针。
因此,您的调用func((void*)42)
应该适用于所有符合标准的编译器。
例如,将文字整数传递给需要 void 指针的参数并且在函数中保持整数不变的最正确方法是什么?
这种将文字整数作为参数传递给期望 a 的函数的方式void*
保证了原始整数在函数中不会受到影响,因为参数是按值传递的。
不应该这样做。
您可以在堆栈上分配值,然后调用该函数。
C中的示例:
int i = 42;
func((void*) (&i));
C++ 中的示例:
int i = 42;
func(reinterpret_cast<void*> (&i));
否则,如果您不确定变量的生命周期,可以使用malloc()/free()或new/delete在堆上分配它。