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

函数中Pointer未正确设置,求助指针的正确传递与使用方法

问题分析

你的问题核心是对C语言参数传递机制的误解:C语言默认采用值传递,当你把test指针传给GetMytest函数时,函数内部拿到的是该指针的副本。你在函数里给副本赋值test = test_check(...),只会修改副本的指向,完全不会影响主函数里原本的test指针,所以主函数中的test始终是初始的NULL。

解决方案

方案1:使用指向指针的指针(最常用方式)

修改GetMytest的参数,让它接收struct mystruct **test(指针的指针),这样就能在函数内部直接修改主函数里指针的指向:

文件1修改后

struct mystruct {
    unsigned short id;
    int number;
    // ... 其他成员
};

struct mystruct *test_check(state *ck, char *name);

void GetMytest(state *ck, char *name, struct mystruct **test) {
    checkfield(ck, name);
    // 通过指针的指针修改原指针的指向
    *test = test_check(ck, name);
    // ... 其他逻辑
}

主文件修改后

struct mystruct *test;

void MainTest() {
    state *ck = check_new();
    // ... 其他初始化逻辑

    // 传入test的地址(指针的指针)
    GetMytest(ck, "Stats", &test);
    
    if(test == NULL)
        printf("Test is NULL");
}

方案2:让函数返回指针

如果逻辑允许,直接让GetMytest返回struct mystruct *类型,主函数直接接收返回值即可:

文件1修改后

struct mystruct {
    unsigned short id;
    int number;
    // ... 其他成员
};

struct mystruct *test_check(state *ck, char *name);

struct mystruct *GetMytest(state *ck, char *name) {
    checkfield(ck, name);
    struct mystruct *test = test_check(ck, name);
    // ... 其他逻辑
    return test;
}

主文件修改后

struct mystruct *test;

void MainTest() {
    state *ck = check_new();
    // ... 其他初始化逻辑

    test = GetMytest(ck, "Stats");
    
    if(test == NULL)
        printf("Test is NULL");
}
关键知识点
  • 在C语言中,若想通过函数修改一个变量(包括指针变量本身),必须传递该变量的地址(即指向它的指针)。
  • 普通指针传递只能修改指针指向的内存内容,无法修改指针本身的指向;只有传递指针的指针,才能改变原指针的指向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:15:24