You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言包装返回void*的函数触发段错误,求排查解决方法

问题分析与解决

你的段错误根源在test_wrap函数的实现:你没有调用传入的函数指针,而是直接返回了函数指针本身的值(也就是new_testarr函数在内存中的地址)。这个地址并不是malloc分配的有效堆内存地址,当你在main里把它当作int*去赋值时,本质是在访问非法内存区域,自然触发段错误。

错误代码的核心问题

void *test_wrap(void *(*functionpointer)(void))
{
    return (*functionpointer); // 这里返回的是函数指针本身,不是函数调用结果
}

修正后的代码

你需要调用这个函数指针,获取它的返回值(也就是malloc分配的内存地址),修改test_wrap如下:

void *test_wrap(void *(*functionpointer)(void))
{
    return (*functionpointer)(); // 调用函数指针,返回其执行结果
    // 或者简化写成 return functionpointer(); 函数指针调用时可省略解引用
}

补充说明

  • 你尝试添加取地址符&new_testarr没用,是因为在C语言中,函数名本身就会隐式转换为指向该函数的指针,new_testarr和&new_testarr的效果完全一致,问题不在函数指针的传递,而在test_wrap内部的逻辑。
  • 单独调用new_testarr()时,你直接执行了函数,得到的是合法的堆内存地址,所以不会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:32:50