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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:54:03