C语言调用changeStr函数无法修改外部字符串指针的问题求助
问题原因分析
你遇到的问题本质是C语言的参数传递都是值传递——哪怕是指针类型的参数,传递的也只是指针变量的副本,而非指针本身。
具体到你的代码:
- 调用
changeStr(str, "Hello world!")时,主程序中str的值(NULL)被复制给了函数内的局部变量string。 - 函数内调用
realloc后,string指向了新分配的内存地址,但这个修改只作用于函数内部的局部变量,和主程序里的str完全无关——它们是两个独立的变量,只是初始值相同而已。 - 主程序里的
str始终是最初的NULL,所以打印结果为(null),后续的free(str)也属于逻辑错误(虽然free(NULL)在多数编译器中不会崩溃,但不符合内存管理的正确逻辑)。
两种修正方案
方案1:使用指针的指针(传递指针的地址)
通过传递指针变量的地址,让函数直接修改主程序中指针变量的值:
#include <stdio.h> #include <string.h> #include <stdlib.h> void changeStr(char **string, char *newStr) { // 解引用拿到主程序里的指针,重新分配内存 *string = realloc(*string, strlen(newStr) + 1); memcpy(*string, newStr, strlen(newStr) + 1); printf("String from function=%s\n", *string); } int main() { char *str = NULL; // 传递str的地址 changeStr(&str, "Hello world!"); printf("String=%s\n", str); char *test = NULL; char *newStr = "hello world"; test = realloc(test, strlen(newStr) + 1); memcpy(test, newStr, strlen(newStr) + 1); printf("NewStr=%s\n", test); free(str); free(test); return 0; }
方案2:让函数返回新的指针地址
修改函数返回值为char*,将realloc后的指针返回给主程序,由主程序更新自己的指针:
#include <stdio.h> #include <string.h> #include <stdlib.h> char* changeStr(char *string, char *newStr) { string = realloc(string, strlen(newStr) + 1); memcpy(string, newStr, strlen(newStr) + 1); printf("String from function=%s\n", string); return string; } int main() { char *str = NULL; // 接收函数返回的新指针 str = changeStr(str, "Hello world!"); printf("String=%s\n", str); char *test = NULL; char *newStr = "hello world"; test = realloc(test, strlen(newStr) + 1); memcpy(test, newStr, strlen(newStr) + 1); printf("NewStr=%s\n", test); free(str); free(test); return 0; }
额外提醒
实际开发中,建议给realloc的返回值加错误判断(比如检查是否为NULL),避免内存分配失败导致程序崩溃。
内容的提问来源于stack exchange,提问作者iocode
相关产品推荐
相关产品推荐

