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

