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

如何处理含指针成员的结构体赋值以实现深拷贝?

C语言中结构体指针成员的深拷贝实现

C语言没有C++那样的赋值运算符重载机制,默认的结构体赋值是浅拷贝——只会复制指针本身,不会复制指针指向的内存块,最终会导致两个结构体的children数组指向同一片内存,修改其中一个会影响另一个,甚至释放内存时出现重复释放的崩溃问题。要实现深拷贝,你需要手动编写专用的拷贝函数,同时配套内存释放逻辑避免泄漏。

1. 编写深拷贝函数

遍历结构体的children数组,对每个非空指针递归创建新的jsonobject实例,完成内存的完整复制:

#include <stdlib.h>
#include <string.h>

struct jsonobject {
    struct jsonobject* children[100];
};

// 深拷贝函数
struct jsonobject* jsonobject_deep_copy(const struct jsonobject* src) {
    if (src == NULL) return NULL;
    
    // 分配新结构体的内存
    struct jsonobject* dest = malloc(sizeof(struct jsonobject));
    if (dest == NULL) return NULL;
    
    // 初始化子节点数组,避免野指针
    memset(dest->children, 0, sizeof(dest->children));
    
    // 递归拷贝每个子节点
    for (int i = 0; i < 100; i++) {
        if (src->children[i] != NULL) {
            dest->children[i] = jsonobject_deep_copy(src->children[i]);
        }
    }
    
    return dest;
}

2. 编写内存释放函数

为了避免内存泄漏和重复释放,需要递归释放当前结构体及其所有子节点的内存:

// 递归释放结构体内存
void jsonobject_free(struct jsonobject* obj) {
    if (obj == NULL) return;
    
    // 先释放所有子节点
    for (int i = 0; i < 100; i++) {
        if (obj->children[i] != NULL) {
            jsonobject_free(obj->children[i]);
        }
    }
    
    // 释放当前结构体
    free(obj);
}

3. 在主函数中使用

替换原来的直接赋值,调用深拷贝函数创建完全独立的结构体实例:

int main(int argc, const char * argv[]) {
    // 初始化原结构体
    struct jsonobject* obj = malloc(sizeof(struct jsonobject));
    memset(obj->children, 0, sizeof(obj->children));
    // 这里可以给obj的children添加子节点
    
    // 执行深拷贝
    struct jsonobject* obj2 = jsonobject_deep_copy(obj);
    
    // 使用完成后释放内存
    jsonobject_free(obj);
    jsonobject_free(obj2);
    
    return 0;
}

注意事项

  • 如果jsonobject结构体还有其他非指针成员(比如字符串、数值),深拷贝函数中也要对应复制这些成员内容。
  • 递归拷贝要注意栈溢出风险,如果结构体层级极深,需要改为迭代方式实现拷贝。
  • 必须配套使用释放函数,否则会造成严重的内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:15:35