C++中能否将函数指针指向带const参数的函数?
解答
一、针对int foo(const int A)的两种赋值合法性判断
C语言标准明确规定:函数参数列表中的顶层const限定符不参与函数类型匹配。值传递场景下的const int属于顶层const,作用仅为限制foo函数内部对形参A本身的修改,不会改变函数的调用签名。
- 第一种写法:
int (*Mypointer)(const int); Mypointer = &foo;
完全合法。函数指针的参数列表和foo的定义完全匹配,类型兼容,赋值没有任何问题。
- 第二种写法:
int (*Mypointer)(int); Mypointer = &foo;
同样合法。由于参数的顶层const会被忽略,int (*)(int)和int (*)(const int)属于完全相同的函数指针类型,类型匹配,赋值有效。
二、int foo(int A)赋值给带const参数的函数指针后出现段错误的原因
首先可以明确:这个赋值操作本身是完全合法的,赋值行为不会直接触发段错误,问题出在你代码的其他部分,常见排查方向如下:
- foo函数内部存在内存访问违规:比如数组越界读写、访问空指针、重复释放内存、访问已经被释放的内存等,和函数指针的参数const声明没有关联
- 调用Mypointer时传入了非法参数:如果foo的逻辑会把传入的整型参数当成地址访问,你传入了非法的整数值(比如0、未初始化的垃圾值),就会触发段错误
- 其他代码的内存越界破坏了函数指针的存储内容:比如Mypointer附近的数组写越界,覆盖了Mypointer存储的函数地址,导致调用时跳转到非法内存地址触发崩溃
内容的提问来源于stack exchange,提问作者junyaozheng98
相关产品推荐
相关产品推荐

