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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:18:39