传递结构体指针至函数未修改原指针,如何实现原指针的修改?
如何通过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
相关产品推荐
相关产品推荐

