我正在尝试在消息框中显示函数的内存地址,但它没有按我想要的方式显示它。
我想将回调函数的函数地址传递给另一个函数,所以我试图获取它的地址。
我查看了此示例,并尝试先在 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;
}
但是,这些消息框显示非常大的数字,并且它们似乎为空。
我喜欢将它们显示在消息框中,就像在链接帖子的示例输出中一样。
提前谢谢。
我对代码进行了一些更改,使其更c++
-y,现在它似乎可以工作:
- 我正在使用
std::cout
而不是snprintf
打印。 - 我正在通过
std::stringstream
将指针地址转换为std::string
。这对您的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]