我刚刚开始研究 C 中的函数指针。为了理解函数指针的转换是如何工作的,我编写了以下程序。它基本上创建了一个指向带有一个参数的函数的函数指针,将其转换为具有三个参数的函数指针,然后调用该函数,提供三个参数。我很好奇会发生什么:
#include <stdio.h>
int square(int val){
return val*val;
}
void printit(void* ptr){
int (*fptr)(int,int,int) = (int (*)(int,int,int)) (ptr);
printf("Call function with parameters 2,4,8.\n");
printf("Result: %d\n", fptr(2,4,8));
}
int main(void)
{
printit(square);
return 0;
}
这编译和运行没有错误或警告(Linux / x86 上的 gcc -Wall)。我的系统上的输出是:
Call function with parameters 2,4,8.
Result: 4
显然,多余的论点只是默默地丢弃了。
现在我想了解这里到底发生了什么。
- 至于合法性:如果我正确理解将函数指针转换为另一种类型的答案,这只是未定义的行为。所以这个运行并产生合理结果的事实只是纯粹的运气,对吗?(或编译器编写者的好意)
- 为什么 gcc 不会警告我这一点,即使是 Wall?这是编译器无法检测到的吗?为什么?
我来自 Java,其中类型检查要严格得多,所以这种行为让我有点困惑。也许我正在经历文化冲击:-)。