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を指しているときに呼び出すとすぐに、引数 2 が渡されないためfunc2func2ガベージが返されます (スタック上または CPU レジスタ内のランダムな値になります)。

于 2013-03-06T09:37:18.980 に答える
0

関数ポインタfp1を使用して関数func2の呼び出しを作成すると、スタックに渡される値は1つだけですが、実際には、function2はスタックの2番目の値も参照します。したがって、どちらのプログラムでもセグメンテーション違反が発生して失敗します。または、失敗しない場合、2番目の引数にはガベージ値があります。

于 2013-03-06T09:41:46.663 に答える