【问题标题】:Why can I invoke a function via a pointer with too many arguments?为什么我可以通过带有太多参数的指针调用函数?
【发布时间】:2011-10-31 16:30:37
【问题描述】:

假设我有这个功能:

int func2() {
    printf("func2\n");
    return 0;
}

现在我声明一个指针:

int (*fp)(double);

这应该指向一个接受double 参数并返回int 的函数。

func2 没有任何论据,但是当我写的时候:

fp = func2;
fp(2);

2 只是一个任意数字),func2` 被正确调用。

这是为什么呢?我为函数指针声明的参数数量没有意义吗?

【问题讨论】:

  • 简短的回答是“声明一个没有参数的函数......然后故意传递一个参数......这是错误的”。

标签: c function-pointers calling-convention


【解决方案1】:

是的,有一个意思。在 C 中(但在 C++ 中 不是),用空括号声明的函数意味着它需要 未指定 数量的参数。当你这样做时,你会阻止编译器检查参数的数量和类型;这是 C 语言被 ANSI 和 ISO 标准化之前的遗留物。

未能调用具有正确数量和类型的参数的函数会导致未定义的行为。如果您改为使用void 的参数列表显式声明您的函数采用零参数,那么当您分配错误类型的函数指针时,编译器会给您一个警告:

int func1();  // declare function taking unspecified parameters
int func2(void);  // declare function taking zero parameters
...
// No warning, since parameters are potentially compatible; calling will lead
// to undefined behavior
int (*fp1)(double) = func1;
...
// warning: assignment from incompatible pointer type
int (*fp2)(double) = func2;

【讨论】:

    【解决方案2】:

    你需要显式声明参数,否则你会得到未定义的行为:)

    int func2(double x)
    {
        printf("func2(%lf)\n", x);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 1970-01-01
      • 2012-01-04
      • 2014-09-17
      • 2012-08-17
      • 2020-11-03
      • 1970-01-01
      • 2015-06-29
      • 2020-11-19
      相关资源
      最近更新 更多