指针是“值传递”吗?调用f()后ptr未指向预期内存的问题
问题根源
你的核心问题是C语言里的指针参数默认是值传递:你传给f()的是main中ptr变量的一份副本,f()内部对ptr的赋值(ptr = (char*)malloc(1);)只会修改这个副本,完全影响不到main里的原始ptr。
main里的ptr从始至终都是未初始化的野指针,直接解引用*ptr自然会触发段错误。
两种修复方案
方案1:使用指针的指针(char**)传递
通过传递指针变量的地址,让函数能直接修改原始指针的值:
#include <stdio.h> #include <stdlib.h> void f(char** ptr) { // 对指针的指针解引用,修改原始指针变量 *ptr = (char*) malloc(1); **ptr = 'A'; } int main() { char* ptr; f(&ptr); // 传入ptr的地址 printf("%c\n", *ptr); // 正常输出'A' free(ptr); // 记得释放内存,避免泄漏 return 0; }
方案2:让函数返回malloc的地址
直接把分配好的内存地址返回给main,由main接收:
#include <stdio.h> #include <stdlib.h> char* f() { char* ptr = (char*) malloc(1); *ptr = 'A'; return ptr; } int main() { char* ptr = f(); // 接收返回的内存地址 printf("%c\n", *ptr); // 正常输出'A' free(ptr); return 0; }
额外注意
- 不管用哪种方案,都要记得调用
free()释放malloc分配的内存,避免内存泄漏。 - 如果你遵循C标准,其实可以不用强制转换
malloc的返回值(malloc返回void*,会自动隐式转换为其他指针类型),强制转换反而可能掩盖潜在的编译警告。
内容的提问来源于stack exchange,提问作者r10n
相关产品推荐
相关产品推荐

