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
相关产品推荐
相关产品推荐

