【问题标题】:C++ Any pointer as function argumentC++ 任何指针作为函数参数
【发布时间】: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.seccondB*,而不是 int*。并且将“外部”地址存储为普通指针非常脆弱。
  • 这背后的原因是我想使用与我的目标完全相同的结构。是的,由于我在编辑中所做的更改,代码不会导致此错误:)

标签: c++ function pointers arguments


【解决方案1】:

您可以使用重载在一个地方进行转换

static NTSTATUS Read(const void* p, size_t size, PVOID buff)
{
    return Read(std::uintptr_t(p), size, buff);
}

【讨论】:

  • 我很确定我已经尝试过了,抱歉有问题的人,谢谢!
【解决方案2】:

您正在使用一个int*,因为您的函数等待uintptr_t。 一个已签名,另一个未签名。

尝试使用unsigned 代替int 或尝试使用std::intptr_t 代替std::uintptr_t

编辑: 解决问题的方法可能是这样的:

class B {
    int *number;
    operator int*() {
        return number;
    }
};

之后,您可以执行以下操作: Read(*objA.second, ...);

Jarod42 的回答也不错!

【讨论】:

  • 我可能问错了我的问题,你现在可以看看吗?问题不是有符号无符号,而是必须转换为 std::uintptr_t ,它在内存中保存对象的地址。
  • 看看我的编辑,看看@Jarod42 的答案:)。
【解决方案3】:

我想你可以使用 void 指针作为参数。例如:

static NTSTATUS Read(void* address, size_t size, PVOID buff);

但是您可能应该将另一个参数传递给函数,以确定您应该将地址变量转换为的类型。例如:

static NTSTATUS Read(void* address,unsigned code, size_t size, PVOID buff)
{
     //code could be int=1,float=2,...
     switch(code)
     {
         //handle each case int,float,custom type ...
         //by casting the address to the corresponding type(code)
     }
}

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多