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的函数,为什么编译器不抱怨?
此外,由于这种情况的发生,会发生什么变化的第二个参数y的invalid功能?
小智 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)
与海湾合作委员会。你的原始代码也给了我多个警告,顺便说一句 - 你使用的是哪个编译器?如果你的问题确实是“为什么这段代码似乎有效?”,那么这就是未定义行为的乐趣之一。