函数中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
相关产品推荐
相关产品推荐

