You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指针是“值传递”吗?调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:45:30