考虑这个程序:
int func2(char x, char y)
{
return x+y;
}
int (*fp1)(char);
void main()
{
fp1 = func2; /* func2 has one more argument than fp1 */
}
最终作业是否符合C90标准?
Keil C51 v9.06接受程序时没有警告,而gcc抱怨
警告:从不兼容的指针类型
分配
我想知道这是否是Keil编译器中的错误,或者实际上是符合C90的处理方式。
更新:根据this answer on C99,相应的演员是合法的。但是如果调用函数指针,则会得到未定义的行为。这是否意味着作业也是合法的?
答案 0 :(得分:1)
真正的问题是你为什么要这样做?
一旦你指向fp1
时调用func2
,func2
将返回垃圾,因为参数2未被传递(它将是堆栈上的一些随机值,或者在CPU寄存器中。)
答案 1 :(得分:0)
当你使用函数指针fp1构建函数func2的调用时,堆栈上只传递一个值,但实际上,function2也会在堆栈上引用第二个值。所以任何一个程序都会给出分段错误和失败。或者,如果没有失败,第二个参数将具有垃圾值。