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
相关产品推荐
相关产品推荐

