另一种形式的C语言回调或者递归。使用gcc可以编译通过,可能会有警告说long类型不能使用%ld输出。
- #include <stdio.h>
-
-
int show();
-
-
int main()
-
{
-
show(1,show);
-
return 0;
-
}
-
-
int show(int a)
-
{
-
typedef int (*FUNC)();
-
-
FUNC p = (FUNC)*(&a+1);
-
-
printf("show a = %ld p = %p show = %p\n",a,p,show);
-
-
p(++a,p);
-
return 0;
-
}
该程序在Ubuntu上可以运行,但是会出堆栈溢出错误。可以使用命令ulimit设置堆栈
大小为无限制。就可以一直运行了。
因为在C语言中,函数声明时参数的位置不加void,说明函数不知道接不接受参数。
所以在下面的实现中使用一个参数进行实现函数,编译器不会报错。
因为在声明的时候没有说明函数是否接受参数,所以在main函数中调用show时,使用
了两个参数,一个是常量1,另一个是函数指针show。
因为C的参数是入栈的,所以在show中取得了在main中传入的第二个参数。也许这里的
取得方式很奇怪,这是因为C的指针就是超级难懂的。show函数中取得的函数指针式绝
对正确的,可以试着运行一下。
阅读(1791) | 评论(0) | 转发(1) |