Tag: 类型 安全性

如果我转换函数指针,改变参数的数量会发生什么

我刚刚开始围绕C中的函数指针。要了解函数指针的转换是如何工作的,我编写了以下程序。 它基本上创建了一个函数指针,该函数指向一个带有一个参数的函数,将它转换为带有三个参数的函数指针,并调用该函数,提供三个参数。 我很好奇会发生什么: #include 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? 这是编译器无法检测到的东西吗? 为什么? […]