Chinaunix首页 | 论坛 | 博客
  • 博客访问: 973017
  • 博文数量: 403
  • 博客积分: 27
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-25 22:20
文章分类

全部博文(403)

文章存档

2016年(3)

2015年(16)

2014年(163)

2013年(222)

分类: LINUX

2013-05-24 16:57:23

原文地址:另一种形式的C递归 作者:file3

另一种形式的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函数中取得的函数指针式绝
对正确的,可以试着运行一下。

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