这样使用C函数指针安全吗?

这样使用C函数指针安全吗?,c,polymorphism,C,Polymorphism,源代码示例是: int add2(int a0, int a1) { return a0+a1; } int add4(int a0, int a1, int a2, int a3) { return a0+a1+a2+a3; } int (*fptr)(int a0,int a1,int a2,int a3,int a4,int a5,int a6,int a7); int main() { volatile int ret0; int a0=0;

源代码示例是:

int add2(int a0, int a1)
{
    return a0+a1;
}

int add4(int a0, int a1, int a2, int a3)
{
    return a0+a1+a2+a3;
}

int (*fptr)(int a0,int a1,int a2,int a3,int a4,int a5,int a6,int a7);

int main()
{
    volatile int ret0;
    int a0=0;
    int a1=1;
    int a2=2;
    int a3=3;
    int a4=4;
    int a5=5;
    int a6=6;
    int a7=7;

    fptr = add4;
    ret0=fptr(a0,a1,a2,a3,a4,a5,a6,a7);

    return ret0;
}
在这个例子中,我们有8个参数的函数指针。 我给这个指针分配了包含4个参数的函数指针。 在这种情况下,编译器可能会生成汇编代码,它将使用堆栈和寄存器,而目标函数中没有使用这些堆栈和寄存器(有4个参数)。 分配和使用参数少于函数指针的函数的地址合法吗? 使用这样的编程模式安全吗

分配和使用参数少于函数指针的函数的地址合法吗

否,函数指针的参数类型和数量应与基础函数相同

参考号

以下约束条件适用于简单分配

  • 两个操作数都是指向兼容类型的限定或非限定版本的指针,左侧指向的类型具有右侧指向的类型的所有限定符

分配有效:

fptr = add4;
C17::6.3.2.3::8:

指向一种类型函数的指针可以转换为指向 功能的另一种类型,并再次返回;结果应进行比较 等于原始指针。如果使用转换的指针调用 其类型与引用类型不兼容的函数 行为是未定义的

但是,只能将其存储为不同的函数指针,而不能使用它(实际调用函数):

C17::6.5.2.2::约束。2:

如果表示被调用函数的表达式的类型 包括原型,参数数量应与 参数数量。每个参数的类型应确保其 值可以指定给具有不合格版本的对象 其对应参数的类型


链接:

uncp.c:25:10:警告:来自不兼容指针类型的分配[默认启用]fptr=add4我收到了这个警告。对。我得到了同样的警告。但它并没有说这是一个错误。你为什么要做这样的事?您应该使用数组,而不是定义大量变量,使用单个函数,传入数组和其他必要的变量parameters@Spikatrix这是一个取自真实代码的示例。您在谈论什么真实代码?不。未定义的行为在调用中;赋值有效:C17::6.3.2.3::8:“指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再返回;结果应与原始指针进行比较。如果使用转换后的指针调用类型与引用类型不兼容的函数,则行为未定义。”
ret0 = fptr(a0, a1, a2, a3, a4, a5, a6, a7);