问题描述
- C语言,如何在一个函数内部,获取这个函数入口点的地址? 1C
- # Git@OSC 的 Android 和 iOS 客户端全面开源
include #include void show(void* p) { printf(""%pn""p); } int main() { show(&show); show(show); return 0; } Output: 1 2 0x8048480 0x8048480
解决方案
答案处处有.
函数名称就是入口地址。
#include
static unsigned int PFN_ARR[100] = { 0 };
void fun1(void);
void fun2(int a);
int main()
{
void (*pfn_fun1)();
fun1();
fun2(5);
pfn_fun1= (void(*)())(PFN_ARR[0]);pfn_fun1();getchar();return 0;
}
void fun1(void)
{
void (*pfn)(void) = fun1;
unsigned int fun_addr = (unsigned int)pfn;
PFN_ARR[0] = fun_addr;
printf(""fun1n"");
}
void fun2(int a)
{
void (*pfn)(int) = fun2;
unsigned int fun_addr = (unsigned int)pfn;
PFN_ARR[1] = fun_addr;
printf(""fun2n"");
}
解决方案二:
void *p = show;
printf(""p = 0X%8Xn"" (int)p);
解决方案三:
函数名,与数组名类似,是指针常量。如
TCHAR tcArray[100];
TCHAR *ptcPoint = tcArray;
TCHAR *ptcPoint2 = (TCHAR *)&tcArray;
TRACE(""0x%X 0x%X 0x%Xrn""tcArrayptcPointptcPoint2);
// 输入是相同的: 0x12EDBC 0x12EDBC 0x12EDBC
解决方案四:
void fun(){
printf(""函数fun的地址 = %x"" fun);
}
解决方案五:
void fun(){
printf(""函数fun的地址 = %p"" fun);
}
解决方案六:
void show(){
printf(""函数fun的地址 = %p"" show);
}
解决方案七:
LZ说的应该是递归调用吧