我刚开始了解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上经过编译并且运行时没有出现错误或警告信息。我的系统输出结果为:
Call function with parameters 2,4,8.
Result: 4
显然,这些多余的参数只是被悄无声息地丢弃了。
现在我想了解到底发生了什么。
- 就合法性而言:如果我正确理解了将函数指针强制转换为另一种类型的答案,那么这只是未定义行为。因此,这能够运行并产生合理结果纯粹只是运气吗?(或者说编译器作者很好心)
- 为什么gcc甚至不会通过Wall选项警告我这个问题呢?这是编译器无法检测到的东西吗?为什么?
我来自Java,那里类型检查要严格得多,所以这种行为让我有点困惑。也许我正在经历文化冲击 :-)。