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

时间:2017-08-18 06:33:01

标签: c++ visual-c++ memory-address

我正在尝试在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;
}

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

我喜欢将它们显示在消息框中,就像在链接帖子的示例输出中一样。

先谢谢。

1 个答案:

答案 0 :(得分:2)

我在代码中进行了一些更改,使其更加c++ - y,现在它似乎有用了:

  1. 我正在使用std::cout来代替snprintf
  2. 我正在通过std::string将指针地址转换为std::stringstream。对于MessageBox
  3. ,这应该没有问题
  4. 我将功能签名更改为const char**以避免任何问题。
  5. 最终代码:

    #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]