我正在尝试在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;
}
但是,这些消息框显示非常大的数字,它们似乎为空。
我喜欢将它们显示在消息框中,就像在链接帖子的示例输出中一样。
先谢谢。
答案 0 :(得分:2)
我在代码中进行了一些更改,使其更加c++
- y,现在它似乎有用了:
std::cout
来代替snprintf
。std::string
将指针地址转换为std::stringstream
。对于MessageBox
。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]