char指针使用问题:如何从store_stuff函数取值并在main中打印?
解决你的C语言char指针传参问题
嘿,你的代码其实已经走在正确的路上了!咱们把逻辑掰碎了说,再聊聊两种常见的实现方式,还有需要注意的细节:
先搞懂你当前代码为什么能跑
你在main里定义的char *name是个指针变量,它本身存的是内存地址。当你把&name传给store_stuff的char **name参数时,相当于把这个指针自己的地址递了过去——这样函数就能直接修改main里那个name指针指向的位置,而不是修改指针指向的内容。
在store_stuff里,*name = "John";是把字符串字面量"John"的地址塞给了main里的name指针,所以回到main打印的时候,自然能输出这个字符串。不过这里有个小坑:字符串字面量存在程序的只读内存区,要是之后你想改它的内容(比如name[0] = 'j'),会直接触发未定义行为,大概率程序崩给你看。
优化版:规范的只读字符串实现
你的原代码可以正常运行,只是给指针加个初始化更规范,避免编译器警告:
#include <stdio.h> #include <string.h> #include <assert.h> void store_stuff(char **name, int *age); int main(void) { char *name = NULL; // 先把指针初始化为NULL,更严谨 int age; store_stuff(&name, &age); printf("Name: %s\n", name); printf("Age: %d\n", age); } void store_stuff(char **name, int *age) { *name = "John"; // 赋值只读字符串字面量的地址 *age = 31; }
如果需要可修改的字符串:用动态内存分配
要是你之后需要修改名字的内容,就得用malloc分配一块可写的内存,再把字符串拷贝进去。记得用完要释放内存,不然会漏内存:
#include <stdio.h> #include <string.h> #include <stdlib.h> // 要包含malloc和free的头文件 void store_stuff(char **name, int *age); int main(void) { char *name = NULL; int age; store_stuff(&name, &age); if (name != NULL) { printf("Name: %s\n", name); // 现在可以放心修改字符串内容了 name[0] = 'j'; printf("Modified name: %s\n", name); free(name); // 一定要释放动态分配的内存! } printf("Age: %d\n", age); } void store_stuff(char **name, int *age) { const char *temp_name = "John"; // 分配足够存下整个字符串的内存(包括末尾的'\0') *name = malloc(strlen(temp_name) + 1); if (*name != NULL) { strcpy(*name, temp_name); // 把字符串拷贝到分配的内存里 } *age = 31; }
最后说下你疑惑的调用语句
你在main里写的store_stuff(&name, &age);完全正确!因为:
name是char*类型,它的地址就是char**类型,正好匹配函数的第一个参数age是int类型,它的地址是int*类型,匹配第二个参数
只有这样传参,函数才能修改main里的指针指向,以及age的值。
内容的提问来源于stack exchange,提问作者Zoey Malkov
相关产品推荐
相关产品推荐

