C语言中如何将结构体引用传入结构体数组而非存储结构体副本
C语言中如何将结构体引用传入结构体数组而非存储结构体副本
嗨,我完全懂你的需求!你现在的代码里,数组存的是结构体的副本,所以修改原结构体的时候,数组里的那个“备份”不会跟着变。其实在C语言里没有真正的“引用”,但我们可以通过存储结构体指针来实现类似的效果——让数组里的每个元素指向原结构体,这样修改原结构体时,数组里的对应元素自然就会同步更新。
咱们来一步步调整你的代码:
问题根源
你当前的students是Student *类型,本质是一个Student结构体的数组,每次调用add_student时,你把传入的结构体解引用后复制了一份存到数组里(temp[size-1] = *student;),所以数组里的元素和原结构体是完全独立的两个实例,修改原结构体当然不会影响数组里的副本。
修改方案
我们需要把数组改成存储结构体指针的数组,也就是把students的类型从Student *改成Student **,这样每个数组元素都是指向Student结构体的指针,直接指向原结构体的地址。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> typedef struct student { int age; char *name; } Student; // 改成指针数组,每个元素是指向Student的指针 Student **students; int size = 0; void add_student(Student *student) { Student **temp; size++; // 分配指针类型的内存空间,而非结构体 temp = realloc(students, sizeof(Student *) * size); if(!temp) { printf("Cannot realloc memory\n"); exit(1); } // 直接存储传入的结构体指针,无需复制结构体内容 temp[size-1] = student; students = temp; } int main(int argc, char **argv) { // 初始化指针数组,分配0个指针的空间 students = malloc(0 * sizeof(Student *)); Student student; student.name = "name1"; student.age = 11; add_student(&student); Student student2; student2.name = "name2"; student2.age = 13; add_student(&student2); // 修改原结构体 student2.age = 22; student2.name = "name33"; // 验证:数组里的元素会同步更新 printf("students[1]->age: %d\n", students[1]->age); printf("students[1]->name: %s\n", students[1]->name); // 释放指针数组内存,避免泄漏 free(students); return 0; }
关键注意点
- 结构体生命周期:要确保存入数组的指针指向的结构体是有效的,不会提前被销毁。比如如果是在某个函数里创建的局部结构体,函数结束后该结构体的内存会被释放,数组里的指针就变成了野指针,访问会触发错误。这种场景下,你需要用
malloc动态分配结构体,比如Student *student = malloc(sizeof(Student));,之后记得手动释放结构体内存。 - 内存清理:程序结束前别忘了释放
students指针数组的内存,避免内存泄漏。
备注:内容来源于stack exchange,提问作者Hendrik
相关产品推荐
相关产品推荐

