Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318629
  • 博文数量: 43
  • 博客积分: 1044
  • 博客等级: 准尉
  • 技术积分: 658
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-20 14:56
个人简介

人法地,地法天,天法道,道法自然。

文章分类

全部博文(43)

文章存档

2019年(1)

2013年(3)

2012年(15)

2011年(24)

分类: LINUX

2011-02-09 10:39:36

另一种形式的C语言回调或者递归。使用gcc可以编译通过,可能会有警告说long类型不能使用%ld输出。
  1. #include <stdio.h>

  2. int show();

  3. int main()
  4. {
  5.     show(1,show);
  6.     return 0;
  7. }

  8. int show(int a)
  9. {
  10.     typedef int (*FUNC)();

  11.     FUNC p = (FUNC)*(&a+1);

  12.     printf("show a = %ld p = %p show = %p\n",a,p,show);

  13.     p(++a,p);
  14.     return 0;
  15. }
该程序在Ubuntu上可以运行,但是会出堆栈溢出错误。可以使用命令ulimit设置堆栈
大小为无限制。就可以一直运行了。

因为在C语言中,函数声明时参数的位置不加void,说明函数不知道接不接受参数。
所以在下面的实现中使用一个参数进行实现函数,编译器不会报错。

因为在声明的时候没有说明函数是否接受参数,所以在main函数中调用show时,使用
了两个参数,一个是常量1,另一个是函数指针show。

因为C的参数是入栈的,所以在show中取得了在main中传入的第二个参数。也许这里的
取得方式很奇怪,这是因为C的指针就是超级难懂的。show函数中取得的函数指针式绝
对正确的,可以试着运行一下。

阅读(1775) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~