C++在MessageBox中显示函数地址

3

我想在MessageBox中显示一个函数的内存地址,但是它并不像我想要的那样显示。

我想把回调函数的函数地址传递给另一个函数,所以我尝试获取它的地址。

我看了this 的例子,并试图先在MessageBox中显示它而不是打印到控制台上,然后再使用它。

我的尝试:

char ** fun()
{
    static char * z = (char*)"Merry Christmas :)";
    return &z;
}
int main()
{
    char ** ptr = NULL;

    char ** (*fun_ptr)(); //declaration of pointer to the function
    fun_ptr = &fun;

    ptr = fun();

    char C[256];

    snprintf(C, sizeof(C), "\n %s \n Address of function: [%p]", *ptr, fun_ptr);
    MessageBoxA(nullptr, C, "Hello World!", MB_ICONINFORMATION);

    snprintf(C, sizeof(C), "\n Address of first variable created in fun() = [%p]", (void*)ptr);
    MessageBoxA(nullptr, C, "Hello World!", MB_ICONINFORMATION);

    return 0;
}

但是,这些消息框显示非常大的数字,并且它们似乎为空。

我希望能够像链接帖子中的示例输出一样在消息框中显示它们。

提前致谢。


2
(char*)"Merry Christmas :)"中的强制类型转换是无用且危险的,因为字符串字面值已经是const char* - phuclv
1
你期望函数指针的值是什么样子?我会期望是一个“非常大的数字”。当你说“它们看起来像是空的”,这似乎与“非常大的数字”相矛盾,你是什么意思? - Yunnosch
1
你期望函数指针的值长成什么样子?像这样:0xxxxxxx。:-) 我喜欢在消息框中显示它们,就像链接帖子示例输出中一样。 - Blueeyes789
1
顺便问一下,既然你打了[C++]标签,为什么要使用snprintf?这看起来像是[C]代码。当你的代码可以运行时,请在https://codereview.stackexchange.com/上发布并请求评论。 - Mawg says reinstate Monica
1
如果您的操作系统是64位,则您将看到的地址比链接帖子中的地址大两倍。 - borisbn
显示剩余2条评论
1个回答

2
我对代码进行了一些更改,使它更具C++风格,并且现在似乎可以正常工作:
  1. 我使用 std::cout 来打印,而不是 snprintf
  2. 我通过 std::stringstream 将指针地址转换为 std::string。这对于您的 MessageBox 应该没有问题。
  3. 我将函数签名更改为 const char**,以避免任何问题。
最终代码:
#include <iostream>
#include <sstream>

const char** fun()
{
    static const char* z = "Merry Christmas :)";
    return &z;
}
int main()
{
    const char** (*fun_ptr)() = fun; 
    const char** ptr = fun();

    std::cout << "Address of function: [" << (void*)fun_ptr  << "]" << std::endl;
    std::cout << "Address of first variable created in fun() = [" << (void*)ptr  << "]" << std::endl;

    std::stringstream ss;
    ss << (void*)fun_ptr;
    std::cout << "Address as std::string = [" << ss.str() << "]" << std::endl;

    return 0;
}

输出:

Address of function: [0x106621520]
Address of first variable created in fun() = [0x1066261b0]
Address as std::string = [0x106621520]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接