能力值:
( LV13,RANK:1050 )
|
-
-
2 楼
#include <stdio.h>
#include <windows.h>
static void Demo(int (*_printf) (const char *,...))
{
_printf("Hello, OSIX!n");
return;
}
int main(int argc, char* argv[])
{
char buff[1000] = {0};
int (*_printf) (const char *,...);
int (*_main) (int, char **);
void (*_Demo) (int (*) (const char *,...));
_printf=printf;
_main = main;
_Demo = Demo;
int func_len = (unsigned int)_Demo - (unsigned int)_main;
for (int a=0; a<func_len; a++)
buff[a] = ((char *) _Demo)[a];
_Demo = (void (*) (int (*) (const char *,...))) &buff[0];
try
{
_Demo(_printf);
}
catch(...)
{
}
return 0;
}
|
能力值:
(RANK:330 )
|
-
-
3 楼
诡异的C函数指针
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
请问一下二楼,我这样改为什么不对呢?
#include <stdio.h>
#include <windows.h>
void Demo(int (*_printf) (const char *,...))
{
_printf("Hello, OSIX!\n");
return;
}
int main(int argc, char* argv[])
{
char buff[1000] = {0};
int (*_printf) (const char *,...);
void (*_Demo) (int (*) (const char *,...));
_printf=printf;
int func_len = (unsigned int)main-(unsigned int)Demo;
for (int a=0; a<func_len; a++)
buff[a] = ((char *) Demo)[a];
_Demo = (void (*) (int (*) (const char *,...))) &buff[0];
_Demo(_printf);
return 0;
}
|
能力值:
( LV9,RANK:180 )
|
-
-
5 楼
不了解的东西最好不要用这种写法 - 直接这样减
除非你debug确定过
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我想一般情况下是不会这么用的,但研究一下也挺好的,望仁兄解惑!
|
能力值:
( LV13,RANK:1050 )
|
-
-
7 楼
呵呵,如果你使用vc6 debug编译的话,你的函数名不是代表函数真实的首地址,而是代表函数jmp表中的位置。所以你两者相减的结果是5。
|
能力值:
( LV8,RANK:130 )
|
-
-
8 楼
不错,看着有意思!
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
恩 , 看到了,thanx
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
改成这样后执行不会出错了
不过每次都是进入到catch里面了
|
|
|