C语言中如何用函数通过结构体其他成员计算指定成员的值?
问题原因
你的代码核心问题是结构体参数传递方式错误:add函数采用值传递,调用add(start)时,程序会创建start结构体的副本传给函数参数one。你在函数里修改的只是这个副本的c成员,原结构体start完全不受影响,所以最终输出的还是初始赋值的3。
另外还有一个细节问题:你初始化start时只指定了.c=3和.b=4,未赋值的a会被默认初始化为0,就算传参问题解决,结果也会是0+4=4,而非预期的7,需要修正初始化语句给a赋值3。
解决方案
以下两种方法都能解决问题,可根据场景选择:
方法1:使用指针传递结构体(推荐)
通过传递结构体的地址,让函数直接操作原结构体的内存空间,避免拷贝开销,这是C语言中修改结构体的常用方式。
修改后的完整代码:
#include <stdio.h> typedef struct nums { int a; int b; int c; } number; // 参数改为结构体指针类型 void add(number *one); int main(void) { // 修正a的初始化,确保a=3、b=4 number start = {.a = 3, .b = 4, .c = 0}; // 传递结构体的地址 add(&start); printf("the sum is %d \n", start.c); return 0; } void add(number *one) { // 使用->访问指针指向的结构体成员 one->c = one->a + one->b; }
方法2:让函数返回修改后的结构体
如果不想用指针,可以让函数返回修改后的结构体副本,再赋值给原变量。这种方式更直观,但结构体较大时会产生额外的拷贝开销,适合小型结构体。
修改后的完整代码:
#include <stdio.h> typedef struct nums { int a; int b; int c; } number; // 返回值改为结构体类型 number add(number one); int main(void) { number start = {.a = 3, .b = 4, .c = 0}; // 接收函数返回的修改后的结构体 start = add(start); printf("the sum is %d \n", start.c); return 0; } number add(number one) { one.c = one.a + one.b; // 返回修改后的结构体副本 return one; }
内容的提问来源于stack exchange,提问作者Njigu Mwaura
相关产品推荐
相关产品推荐

