通过函数指针传递附加参数是否合法/在C中定义?

通过函数指针传递附加参数是否合法/在C中定义?,c,parameters,function-pointers,C,Parameters,Function Pointers,可能重复: 假设我用一个实际使用的参数比函数指针定义的参数少的函数初始化一个函数指针,如果通过函数指针调用该函数,该函数是否仍能正确执行 我在gcc中尝试了这一点,并按预期工作,但我想知道这种行为在编译器/平台之间是否一致(我怀疑在某些环境中,它可能会对堆栈造成严重破坏): #包括 typedef void(*myfun)(int,int,int); 无效测试_a(整数x,整数y,整数z){ printf(“测试a%d%d%d\n”,x,y,z); } 无效测试_b(整数x,整数y){ pri

可能重复:

假设我用一个实际使用的参数比函数指针定义的参数少的函数初始化一个函数指针,如果通过函数指针调用该函数,该函数是否仍能正确执行

我在gcc中尝试了这一点,并按预期工作,但我想知道这种行为在编译器/平台之间是否一致(我怀疑在某些环境中,它可能会对堆栈造成严重破坏):

#包括
typedef void(*myfun)(int,int,int);
无效测试_a(整数x,整数y,整数z){
printf(“测试a%d%d%d\n”,x,y,z);
}
无效测试_b(整数x,整数y){
printf(“测试b%d%d\n”,x,y);
}
int main(){
myfun fp;
fp=测试a;
fp(1,2,3);
fp=(myfun)测试b;
fp(4,5,6);
}

程序的行为未定义。它编译的事实完全是因为cast,它有效地告诉编译器“这是错误的,但无论如何都要这样做”。如果删除强制转换,您将收到相应的错误消息:

a.c:17:8: error: assignment from incompatible pointer type [-Werror]
(来自gcc-Wall-Werror)


更具体地说,行为取决于调用约定。如果您在一个平台上,并且参数在堆栈上以“反向”顺序传递,那么程序将给出一个非常不同的结果。

这是未定义的行为。使用风险自负。谣传这会导致


它是否有效取决于所使用的设备


我不建议这样做。

函数调用是未定义的行为

(C99,6.3.2.3p8)“[…]如果使用转换的指针调用类型与指向类型不兼容的函数,则行为未定义。”

有关信息,请注意函数类型:

(C99,6.2.5p20)“[…]描述具有指定返回类型的函数。函数类型为 以其返回类型及其参数的数量和类型为特征。”


如果使用callee清理,它也可能崩溃。我明白了。如何定义没有参数列表的函数指针类型,如` typedef void(*myfun)(')。在这种情况下,编译器会保证堆栈上参数的顺序是“正确”的吗?@BillAskaga否:要“保证”您想要的,您可能需要确保目标函数和函数指针都使用。这张图片太棒了。这里我提供了一个清理过的版本和一个向量跟踪:Lol。谢谢。我给我最喜欢的喜欢涂鸦的女儿讲了一个关于未定义行为的故事。她第二天寄给我的。它有很多值得喜爱的地方。以下是JPG:
a.c:17:8: error: assignment from incompatible pointer type [-Werror]