1

考虑这个程序:

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 的处理方式。

更新:根据C99 上的这个答案,相应的演员表是合法的。但是如果你调用函数指针,你会得到未定义的行为。这是否意味着转让也是合法的?

4

2 回答 2

1

真正的问题是你为什么要这样做?

一旦你调用fp1它指向func2,func2就会返回垃圾,因为参数 2 没有被传递(它将是堆栈上的一些随机值,或者在 CPU 寄存器中)。

于 2013-03-06T09:37:18.980 回答
0

当您使用函数指针 fp1 为函数 func2 构建调用时,堆栈上只会传递一个值,但实际上,函数 2 也会引用堆栈上的第二个值。所以任何一个程序都会给出分段错误并失败。或者如果没有失败,第二个参数将具有垃圾值。

于 2013-03-06T09:41:46.663 回答