读书人

指向函数的指针解决方案

发布时间: 2012-03-23 12:06:21 作者: rapoo

指向函数的指针
我一直认为指向函数的指针,它的类型要和被指的函数一致,如,
int func(int a, char *s)
{
...
}

int main(void)
{
int (*funcptr)(int, char*);

fucnptr(1, "hello ");
}

但我发现不指定函数指针定义时的参数,便可指向任一参数的函数,
#include <stdio.h>

int funcA(int n)
{
printf( "funcA %d\n ", n);

return 0;
}

int funcB(int x, int y)
{
printf( "funcB %d, %d\n ", x, y);

return 0;
}

int funcC(char *s1, char *s2)
{
printf( "funcC %s, %s\n ", s1, s2);

return 0;
}


int main(void)
{
int (*p)();

p = funcA;
(*p)(1);

p = funcB;
(*p)(2, 3);

p = funcC;
(*p)( "ni ", "12345 ");

return 0;
}

这个我在VC6.0和linux(F5)下都试过,可以编译、运行。

另外,
p = funcC;
(*p)( "ni ", 234567);假设数字234567是 "123456 "的地址。
也行。

不知道这会不会有什么问题?

[解决办法]
很老的 K&R C 语言中是不带参数表示省略了参数,可以按任意参数来用。
[解决办法]
C允许这样做,但C++不允许的。
这种情况容易出错。因为都是cdecl调用方式,所以调用者知道参数个数,所以正确恢复栈
但函数本身不知道
#include <stdio.h>

int funcA(int n)
{
printf( "funcA %d\n ", n);

return 0;
}
int main(void)
{
funcA(1,2,3,4,5,6,7,8,9,0);这样也可以编译过去正常运行
}
[解决办法]
系统调用函数指针只是一个call指令C淡化了压栈的高要求,而C++不行,要求严格的平衡堆栈,这也是为什么...省略参数符号收到那么多批评~
C只是相信你能合理压入参数
而C++要求编译器编译阶段就检查~尽一切可能保证如此危险的函数指针的安全性~
[解决办法]
是这样的, 对于这个的讨论以前很激烈的.
这一点来说,c++的要求很安全.

读书人网 >C语言

热点推荐