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

C语言中如何传递结构体数组至函数并修改其成员值

解决结构体数组在函数中修改后生效的问题

你其实已经走在正确的路上了!你的代码里通过指针传递结构体数组的方式完全正确,函数内的修改本来就会直接作用到main函数里的原数组上——之所以你可能误以为没生效,大概率是printf语句里的小语法错误导致的。

为什么你的传递方式是有效的?

在C语言中,当你把数组名(比如main里的servers)作为参数传给函数时,它会自动退化为指向数组第一个元素的指针。所以initialize函数的参数server *servers,本质上指向的就是main里那个servers数组的首地址。你在函数里用servers[i]访问和修改的,就是原数组的元素,这些修改在函数执行完返回后,会直接保留在main的数组中。

修正代码里的小错误

你main函数里的printf语句有个参数不匹配的问题:第一个%d没有对应的输入值。比如第一个printf应该把数组索引(这里是0)作为第一个参数传进去,否则会输出错误的内容。修正后的main部分代码如下:

int main() {
    server servers[2];
    initialize(servers);
    // 修正printf的参数,添加索引值作为第一个%d的对应参数
    printf("server[%d].id = %d\n", 0, servers[0].id);
    printf("server[%d].num_in_Q = %d\n", 0, servers[0].num_in_Q);
    printf("server[%d].server_status = %d\n", 0, servers[0].server_status);
    // 也可以打印第二个服务器的值验证
    printf("server[%d].id = %d\n", 1, servers[1].id);
    return 0;
}

完整可运行代码

把所有部分整合后,完整代码是这样的:

#include <stdio.h>
#include <stdlib.h>
#define Q_LIMT 100
typedef struct servers {
    int id;
    int num_in_Q;
    int server_status;
}server;
void initialize(server *servers);
int main() {
    server servers[2];
    initialize(servers);
    printf("server[%d].id = %d\n", 0, servers[0].id);
    printf("server[%d].num_in_Q = %d\n", 0, servers[0].num_in_Q);
    printf("server[%d].server_status = %d\n", 0, servers[0].server_status);
    printf("server[%d].id = %d\n", 1, servers[1].id);
    return 0;
}
void initialize(server *servers) {
    int i=0;
    for(i=0; i<2; i++) {
        servers[i].id = i;
        servers[i].num_in_Q = 0;
        servers[i].server_status = 0;
    }
}

运行这段代码,你就能看到initialize函数里设置的值已经正确反映在main的输出里了。

内容的提问来源于stack exchange,提问作者Giannis Aggelis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:34:06