首页
社区
课程
招聘
[求助]代码执行总是出错
发表于: 2008-6-20 08:47 5375

[求助]代码执行总是出错

2008-6-20 08:47
5375
下面的代码执行时候总是出错,各位帮忙分析一下原因吧,谢谢了
#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 *,...);
	int (*_main) (int, 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;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 321
活跃值: (271)
能力值: ( 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;
}
2008-6-20 11:22
0
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
3
诡异的C函数指针
2008-6-20 11:42
0
雪    币: 200
活跃值: (10)
能力值: ( 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;
}
2008-6-20 12:00
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
不了解的东西最好不要用这种写法 - 直接这样减
除非你debug确定过
2008-6-20 12:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我想一般情况下是不会这么用的,但研究一下也挺好的,望仁兄解惑!
2008-6-20 12:07
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
7
呵呵,如果你使用vc6 debug编译的话,你的函数名不是代表函数真实的首地址,而是代表函数jmp表中的位置。所以你两者相减的结果是5。
2008-6-20 12:28
0
雪    币: 107
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
不错,看着有意思!
2008-6-20 14:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
恩 , 看到了,thanx
2008-6-20 16:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
改成这样后执行不会出错了
不过每次都是进入到catch里面了
2008-6-20 16:35
0
游客
登录 | 注册 方可回帖
返回
//