C语言中通过向函数传递双指针获取字符串的问题
为什么通过双指针传递无法在main函数中获取modify内分配的字符串?
嘿,我来帮你揪出问题所在——你这段代码踩了C语言里按值传递参数的经典坑,咱们一步步拆解:
问题核心:你修改了参数的副本,而非原变量
你在modify函数里做了这一步:
double_pointer = malloc(sizeof(char*));
这里要搞清楚:modify的参数double_pointer是main函数里&double_pointer的副本(函数参数都是按值传递的,哪怕是指针)。你这行代码直接把这个副本的指向改了——它原本指向main里的char* double_pointer变量,现在变成指向你新malloc的一块内存了。
后面你执行*double_pointer = pointer;,其实是把字符串地址赋值给了这个新malloc的指针,和main里的那个变量完全没关系!所以main函数里的double_pointer还是NULL,自然拿不到字符串。
修正后的代码
你根本不需要给double_pointer本身malloc,直接用它来修改main里的指针变量就行:
#include <stdio.h> #include <stdlib.h> #include <string.h> void modify(char** double_pointer) { // 定义一个char指针并分配内存 char* pointer = malloc(5*sizeof(char)); strcpy(pointer, "test"); printf("%s\n", pointer); // 输出test // 直接通过传入的指针,修改main里的char*变量 *double_pointer = pointer; printf("%s\n", *double_pointer); // 输出test } int main() { char* my_ptr = NULL; // 换个变量名更清晰 modify(&my_ptr); if (my_ptr != NULL) { printf("main里拿到的字符串:%s\n", my_ptr); // 现在能输出test了 free(my_ptr); // 记得释放内存,避免泄漏 } return 0; }
逻辑解释
- main里传递
&my_ptr给modify,modify的参数double_pointer就指向main里的my_ptr变量。 - 当你执行
*double_pointer = pointer;,相当于直接把malloc出来的字符串地址赋值给main里的my_ptr,这样main就能拿到这个地址了。 - 额外提醒:用完malloc的内存一定要free,不然会造成内存泄漏哦。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

