通过C中的函数指针合法/定义传递其他参数?

时间:2012-11-18 21:17:12

标签: c parameters function-pointers

  

可能重复:
  Casting a function pointer to another type

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

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

#include <stdio.h>

typedef void (*myfun)(int, int, int);

void test_a(int x, int y, int z) {
    printf("test_a %d %d %d\n", x, y, z);
}

void test_b(int x, int y) {
    printf("test_b %d %d\n", x, y);
}

int main() {
    myfun fp;
    fp = test_a;
    fp(1, 2, 3);
    fp = (myfun) test_b;
    fp(4, 5, 6);
}

4 个答案:

答案 0 :(得分:11)

这是未定义的行为。使用风险由您自己承担。有传言说会导致Nasal Demons!

enter image description here

答案 1 :(得分:5)

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

a.c:17:8: error: assignment from incompatible pointer type [-Werror]

(来自gcc -Wall -Werror。)

更具体地说,行为取决于调用约定。如果你在平台上,参数在堆栈上以“反向”顺序传递,程序会产生非常不同的结果。

答案 2 :(得分:3)

函数调用是未定义的行为。

  

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

有关信息,请注意功能类型

  

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

答案 3 :(得分:2)

是否有效取决于所使用的calling convention

我不推荐它。