将指针传递给与formal参数的要求不匹配的函数

And*_*ech 5 c pointers function-pointers function

int valid (int x, int y) {
    return x + y;
}

int invalid (int x) {
    return x;
}

int func (int *f (int, int), int x, int y) { 
    //f is a pointer to a function taking 2 ints and returning an int
    return f(x, y);
}

int main () {
    int val = func(valid, 1, 2),
        inval = func(invalid, 1, 2); // <- 'invalid' does not match the contract 

    printf("Valid:   %d\n", val);
    printf("Invalid: %d\n", inval);

    /*  Output:
     *  Valid:   3
     *  Invalid: 1
     */
}
Run Code Online (Sandbox Code Playgroud)

在该行inval = func(invalid, 1, 2);,为什么我没有得到编译器错误?如果func期望一个函数的指针占用2个int并且我将指针传递给一个接受单个int的函数,为什么编译器不抱怨?

此外,由于这种情况的发生,会发生什么变化的第二个参数yinvalid功能?

小智 2

你要:

int func (int (*f) (int, int), int x, int y) { 
Run Code Online (Sandbox Code Playgroud)

您的代码中包含的是返回 int * 的函数的类型 - 您需要一个指向返回 int 的函数的指针。随着这一变化,这一行:

 inval = func(invalid, 1, 2);
Run Code Online (Sandbox Code Playgroud)

给我:

fp.c:16: warning: passing argument 1 of 'func' from incompatible pointer type
fp.c:9: note: expected 'int (*)(int,  int)' but argument is of type 'int (*)(int)'
Run Code Online (Sandbox Code Playgroud)

与海湾合作委员会。你的原始代码也给了我多个警告,顺便说一句 - 你使用的是哪个编译器?如果你的问题确实是“为什么这段代码似乎有效?”,那么这就是未定义行为的乐趣之一。