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

传递结构体指针至函数未修改原指针,如何实现原指针的修改?

如何通过C语言函数修改原指针(以引用方式传递结构体指针)

你碰到的问题其实是C语言里一个很常见的误区:C语言的参数传递默认是值传递。你传给f1函数的foofy是指针变量的一个副本,函数里执行boby = bob只是修改了这个副本的指向,完全没触及主函数里的foofy本身——它还是个未初始化的野指针,访问自然会触发段错误。

要实现让foofy指向foo的地址(从而能访问到'y'),你需要传递指针的指针(也就是双重指针),这样函数才能直接操作原指针变量的指向。

修改后的完整代码

我标注了关键改动的地方:

typedef struct thing{ char x; }thing_t;
#include <stdio.h>
#include <stdlib.h>

// 改动1:把第二个参数改为双重指针,接收原指针的地址
void f1(thing_t *bob, thing_t **boby) {
    bob->x = 'y';
    // 改动2:通过双重指针直接修改原指针的指向
    *boby = bob;
    printf("f1 boby after: %c\n", (*boby)->x);
}

int main(void) {
    thing_t *foo, *foofy;
    // 修正原代码的类型转换和sizeof写法,用sizeof(thing_t)更准确
    foo = (thing_t*)malloc(sizeof(thing_t));
    foo->x = 'x';
    printf("foo before: %c\n", foo->x);
    // 改动3:传递foofy的地址,让函数能操作原指针
    f1(foo, &foofy);
    printf("foo after: %c\n", foo->x);
    printf("foofy after: %c\n", foofy->x);
    
    // 额外提醒:记得释放malloc分配的内存,避免泄漏
    free(foo);
    return 0;
}

运行输出

执行这段代码后,你会得到预期的结果:

foo before: x
f1 boby after: y
foo after: y
foofy after: y

关键原理说明

  • 当你传递&foofy给函数时,函数收到的是foofy这个指针变量本身的地址。
  • 在函数里,*boby就等价于主函数里的foofy变量,所以*boby = bob直接修改了foofy的指向,让它和bob(也就是foo)指向同一块内存。
  • 原代码里的类型转换和sizeof写法有小错误,我一起修正了——用sizeof(thing_t)或者sizeof(*foo)比写结构体原名更安全,能避免类型不匹配的问题。

内容的提问来源于stack exchange,提问作者Ghesa Bhakti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:19:09