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

如何在C语言的void函数中为指针参数分配新值?

问题分析与解决方案

你的代码存在两个核心问题:

  1. 函数function的参数是值传递的一级指针,你在函数内修改的只是形参的地址,完全不会影响main里的指针变量本身;
  2. val1、val2是函数栈上的局部变量,函数执行完毕后会被销毁,就算你修改指针成功,main里访问的也是已释放的内存,属于未定义行为。

下面提供两种可行的解决思路:


方案一:用二级指针修改指针本身(推荐)

如果需要让main里的指针指向新的内存地址,必须用指向指针的指针作为函数参数,这样才能直接修改main中的指针变量:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

void function(int **c1, int **c2){
    // 动态分配堆内存,避免局部变量销毁的问题
    *c1 = malloc(sizeof(int));
    *c2 = malloc(sizeof(int));
    
    // 检查内存分配是否成功
    if(*c1 == NULL || *c2 == NULL){
        perror("内存分配失败");
        return;
    }
    
    // 给新分配的内存赋值
    **c1 = 1;
    **c2 = 2;
}

int main(){
    int *c1 = NULL, *c2 = NULL;

    function(&c1, &c2);
    
    // 检查指针是否有效后再访问
    if(c1 != NULL && c2 != NULL){
        printf("*c1=%d, *c2=%d\n", *c1, *c2);
    }
    
    // 记得释放堆内存,避免泄漏
    free(c1);
    free(c2);
    return 0;
}

方案二:提前分配内存,直接修改指针指向的内容

如果不需要修改指针本身,只是要更新指针指向的数值,可以提前在main里给指针分配有效内存(栈或堆),函数内直接修改内存内容:

#include <stdio.h>
#include <stdlib.h>

void function(int *c1, int *c2){
    // 直接修改指针指向的内存值
    *c1 = 1;
    *c2 = 2;
}

int main(){
    // 方式1:用栈上的局部变量(无需手动释放)
    int val1, val2;
    int *c1 = &val1, *c2 = &val2;
    
    // 方式2:用堆内存(需要手动free)
    // int *c1 = malloc(sizeof(int));
    // int *c2 = malloc(sizeof(int));
    // if(c1 == NULL || c2 == NULL){
    //     perror("内存分配失败");
    //     return 1;
    // }

    function(c1, c2);
    printf("*c1=%d, *c2=%d\n", *c1, *c2);

    // 如果用了堆内存,记得释放
    // free(c1);
    // free(c2);
    return 0;
}

关于你之前内存分配失败的原因

你应该是直接在function里给形参c1分配了内存,但形参是局部变量,修改后不会同步到main的实参里,main里的指针还是NULL或野指针,访问自然会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:25:21