这样使用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);