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

C语言函数传入的指针指向在主程序未更新,如何修复?

问题原因

C语言函数参数采用值传递,changer函数中的p是主函数里p的副本,修改副本的指向不会影响原指针的指向,所以主程序的printf输出的还是原来的值。

修复方案

方案一:使用二级指针传递

通过传递指针的地址(二级指针),让函数直接修改原指针的指向:

#include <stdio.h>
#include <stdlib.h>
void changer(char **p, char user1[], char user2[]);
int main()
{
    char *p = malloc(10*sizeof(char));
    char user1[10] = "rania";
    char user2[10] = "souad";
    p = user1;
    changer(&p, user1, user2); // 传递指针的地址
    printf("%s\n", p);
    // 注意:原malloc的内存被p=user1覆盖,存在内存泄漏,实际使用需调整
    return 0;
}
void changer(char **p, char user1[], char user2[])
{
    if (*p == user1){
        *p = user2; // 解引用二级指针,修改原指针的指向
    } else {
        *p = user1;
    }
}

方案二:让函数返回修改后的指针

修改函数返回类型为指针,主函数接收返回值更新原指针:

#include <stdio.h>
#include <stdlib.h>
char* changer(char *p, char user1[], char user2[]);
int main()
{
    char *p = malloc(10*sizeof(char));
    char user1[10] = "rania";
    char user2[10] = "souad";
    p = user1;
    p = changer(p, user1, user2); // 接收返回的新指针
    printf("%s\n", p);
    // 注意:原malloc的内存被p=user1覆盖,存在内存泄漏,实际使用需调整
    return 0;
}
char* changer(char *p, char user1[], char user2[])
{
    return (p == user1) ? user2 : user1;
}
额外提示

原代码存在内存泄漏:malloc分配的内存被p=user1覆盖后,无法再通过指针访问和释放。如果不需要动态分配内存,可以直接定义char *p;;如果需要保留动态内存,不要直接将指针赋值为数组名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:10:28