如何在C语言中使用带指针参数的void函数实现两数求和并返回结果
问题原因分析
你的代码一共存在两个核心问题,共同导致了程序崩溃:
- C语言所有函数参数都是值传递,你传入的
int *x本质是外层指针的副本,函数内执行x = &c仅修改了副本的指向,完全不会影响main函数中pointerParam的实际指向,外层的pointerParam始终是未初始化的野指针,直接解引用访问必然触发段错误。 - 函数内的
int c是栈上的局部临时变量,生命周期仅存在于函数执行期间,函数返回后对应的栈空间会被系统自动回收。你观察到函数内部打印*x正常,是因为函数执行期间c的栈空间还未被回收,但如果把该地址带出函数访问,属于未定义行为,就算偶尔能拿到值也是不稳定的错误逻辑。
正确实现方案
方案1:传入栈变量地址修改值(生产环境推荐)
这是最安全无隐患的实现方式,不需要修改指针本身的指向,直接通过指针修改对应内存的值:
void testFunction(int a, int b, int *x) { // 直接对指针指向的内存地址赋值,x指向的是main函数中sum的有效地址 *x = a + b; } int main() { int n1 = 7; int n2 = 90; int sum; // 提前在main的栈空间开辟存储结果的内存 testFunction(n1, n2, &sum); // 传入sum变量的地址 printf("两数之和是 %d\n", sum); return 0; }
方案2:二级指针修改外层指针指向(仅用于指针练习)
如果你想要练习修改外层指针本身的指向,需要传入指针的地址(也就是二级指针),同时注意不能返回局部栈变量的地址,可以用堆内存存储结果:
#include <stdlib.h> void testFunction(int a, int b, int **x) { // 在堆上开辟内存,生命周期由开发者控制,不会随函数返回被回收 int *res = malloc(sizeof(int)); *res = a + b; // 修改外层指针的指向,因为传入的是指针的地址,修改会生效 *x = res; } int main() { int n1 = 7; int n2 = 90; int *pointerParam; testFunction(n1, n2, &pointerParam); // 传入指针本身的地址 printf("Value of pointer is %d\n", *pointerParam); // 堆内存使用完成后必须手动释放,避免内存泄漏 free(pointerParam); pointerParam = NULL; return 0; }
注意:如果不想用堆内存,也可以把函数内的存储变量声明为static int,静态变量的生命周期为整个程序运行期,不会随函数返回被回收,但静态变量是全局共享的,多次调用函数会覆盖之前的值,仅适合单线程单次调用的场景。
内容的提问来源于stack exchange,提问作者Jerome Durham
相关产品推荐
相关产品推荐

