正确转换为指向返回函数的函数的函数指针

问题描述 投票:0回答:2

我正在逆向源代码,我发现了一个如下所示的函数:

考虑一下:

int examplefn(int x) { return x * 4; }

int (*rtx())(int)
{
    return examplefn;
}

好吧,然后我需要创建一个指向

rtx()
的指针函数来执行挂钩,然后我做了这样的事情:

int (*fncptr())(int) = (int(*())(int))0xC0FFEE; 
/* 0xC0FFEE it's a sample of the memory address of the function...*/

但是我的编译器没有编译它,然后我尝试这样做:

typedef int(*fnc_t())(int);

// Clearer example pointing to rtx

fnc_t* TRY_2 = (fnc_t*)&rtx;

// then has successfully compiled, ex test...

 int main()
 {
    std::cout << TRY_2()(4) << std::endl; // output: 16 ok.
 }

好吧,我进入正题了,如何在不使用

typedef
的情况下进行正确的铸造?

我在网上查遍了,但没有找到任何东西......

c++ visual-c++ c++14 function-pointers
2个回答
6
投票

为什么要避免使用 typedef?它使代码更容易理解:

using F = int(*)(int); // pointer to function taking int and returning int
using G = F(*)();      // pointer to function taking nothing and returning
                       //   a pointer to function taking int and returning int

我没有时间写,其他人也没有时间阅读和理解。我认为这是一场胜利。


5
投票

(int(*())(int))
是一个函数类型(与函数
rtx
具有相同的类型)。您的代码尝试声明一个函数,并将一个整数转换为函数。然而你实际上想要处理一个指向这样的函数的指针。

在:

typedef int(*fnc_t())(int);
之后,可以通过在typedef:
fnc_t *x;
中将
fnc_t
替换为
(*x)
来找到
int (*(*x)())(int)
的等效项。所以你的代码可能是:

int (*(*fncptr)())(int) = (int(*(*)())(int))0xC0FFEE; 

在实际代码中使用一系列

typedef
(或等效的
using
)当然是更好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.