You need to enable JavaScript to run this app. C语言函数指针代码执行异常:输出地址而非预期返回值
优惠活动
大模型
产品
解决方案
定价
更多

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] = &sum;
    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] = &sum;
    sumscadPtrArr[1] = &scad;
}

// 调用示例
int scadVal = sumscadPtrArr[1](par3, getX);

内容的提问来源于stack exchange,提问作者Yigg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 09:51:01