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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:57:57