如何处理含指针成员的结构体赋值以实现深拷贝?
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
相关产品推荐
相关产品推荐

