【发布时间】:2017-05-20 00:02:05
【问题描述】:
这里有一些示例类来重现我所面临的情况:
class A {
B* seccond;
}
class B {
int * number;
}
static NTSTATUS Read(std::uintptr_t address, size_t size, PVOID buff);
// Let's assume we have object 'obj' which has valid address of number variable
int buff;
Read(obj.seccond, sizeof(int), &buff);
Error: cannot convert argument 1 from 'int *' to 'uintptr_t'
我知道它可以通过以下方式轻松修复:
Read(std::uintptr_t(obj.seccond), sizeof(int), &buff);
但这还不够令人满意,因为它降低了代码的可读性,而且很丑。我真的不想使用模板,因为它们已经在我的代码中无处不在。 这些变量有没有简单的容器?或者更优雅的方式?
编辑:我重新调整了问题,对不起
【问题讨论】:
-
std::uintptr_t不是指针类型,它是一个整数。隐式转换会导致很多问题(以 C 的历史为例)。 -
你的代码中到处都有模板 ...再做一个:)
-
我知道,但情况是我正在处理其他进程地址空间,其中结构保存指针,一旦我读取它们,它们应该被视为要传递给
Read函数的普通 uint 值.所以没有办法做到这一点? -
顺便说一句,该代码不会导致该错误 -
obj.seccond是B*,而不是int*。并且将“外部”地址存储为普通指针非常脆弱。 -
这背后的原因是我想使用与我的目标完全相同的结构。是的,由于我在编辑中所做的更改,代码不会导致此错误:)
标签: c++ function pointers arguments