C语言函数指针代码执行异常:输出地址而非预期返回值
问题根因与修复方案
核心错误点
- 没有正确调用函数指针:要获取函数的返回值,必须给函数指针加括号完成调用(无参数也要保留空括号),直接对函数指针解引用或直接赋值,拿到的都是函数在内存中的地址,而非执行结果。
sumscadPtr函数指针类型定义与scad函数签名不匹配:你定义的该类型要求两个入参都是parPtr,但scad第二个入参是const unsigned int,属于类型不兼容,会导致参数传递异常。scad函数内取值逻辑错误:直接将函数指针地址赋值给value1,未调用函数获取返回值。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> unsigned int par1(void) { return 5; } unsigned int par2(void) { return 6; } unsigned int par3(void) { return 7; } const unsigned int x = 10; typedef unsigned int (*parPtr)(void); parPtr parP1 = &par1; parPtr parP2 = &par2; parPtr parP3 = &par3; // 修正:定义匹配对应函数签名的指针类型 typedef int (*sumPtr)(parPtr, parPtr); typedef int (*scadPtr)(parPtr, const unsigned int); sumPtr sumArr[1]; scadPtr scadArr[1]; int sum(parPtr, parPtr); int scad(parPtr, const unsigned int); void allocate_array_of_pointers(void) { sumArr[0] = ∑ scadArr[0] = &scad; } // 修正:正确调用函数指针获取返回值 int sum(parPtr parA, parPtr parB) { unsigned int value1 = parA(); printf("\n%d\n", value1); unsigned int value2 = parB(); printf("\n%d\n", value2); return (int)value1 + (int)value2; } // 修正:正确调用函数指针获取返回值 int scad(parPtr parA, unsigned const int b) { unsigned int value1 = parA(); if((int)value1 > (int)b) return (int)value1 - (int)b; else return (int)b - (int)value1; } int main() { allocate_array_of_pointers(); int sumVal = sumArr[0](par1, par2); int scadVal = scadArr[0](par3, x); printf("\nsumVal is :%d\n", sumVal); printf("\nscadVal is :%d\n", scadVal); int a = parP1(); printf("\n%d\n", a); return 0; }
单数组存储可选方案
如果希望两个函数存入同一个指针数组,可以统一两个函数的入参格式:
// 新增返回固定值x的函数 unsigned int getX(void) { return x; } // 统一两个函数的参数为两个parPtr类型 int scad(parPtr parA, parPtr parB) { unsigned int value1 = parA(); unsigned int b = parB(); if((int)value1 > (int)b) return (int)value1 - (int)b; else return (int)b - (int)value1; } // 统一函数指针类型 typedef int (*sumscadPtr)(parPtr, parPtr); sumscadPtr sumscadPtrArr[2]; // 数组赋值 void allocate_array_of_pointers(void) { sumscadPtrArr[0] = ∑ sumscadPtrArr[1] = &scad; } // 调用示例 int scadVal = sumscadPtrArr[1](par3, getX);
内容的提问来源于stack exchange,提问作者Yigg
相关产品推荐
相关产品推荐

