1

作为一个实验:

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

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

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

4

2 回答 2

4

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

C99 6.3.2.3.5:

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

C++11 5.2.10.5

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

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

例如,将文字整数传递给需要 void 指针的参数并且在函数中保持整数不变的最正确方法是什么?

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

于 2013-11-05T15:52:17.763 回答
0

不应该这样做。

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

C中的示例:

int i = 42;
func((void*) (&i));

C++ 中的示例:

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

否则,如果您不确定变量的生命周期,可以使用malloc()/free()new/delete在堆上分配它。

于 2013-11-05T15:30:06.920 回答