结构体的浅copy和深copy
来源:互联网 发布:怎么退出windows微信 编辑:程序博客网 时间:2024/05/14 16:24
<一>浅复制
关于结构体的浅copy和深copy问题,下面先看一个示例
定义一个Teacher类型结构体, 然后定义变量t1,t2, 对t1进行初始化,然后通过copyStruct函数将t1赋值到t2
代码如下:
#include "stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#define _CRT_SECURE_NO_WARNINGS//定义结构体Teachertypedef struct Teacher{ char* name; int age;}Teacher;//copy Teacher函数int copyStruct(Teacher* to, Teacher* from){ int retCode = 0; if(to == NULL || from == NULL){ retCode = -1; return retCode; } *to = *from; return retCode;}int main(){ //1,声明t1 并且对t1进行初始化 Teacher t1 ; Teacher t2; t1.age = 88; char* name = (char*) malloc(sizeof(char)* 64); t1.name = name; strcpy(t1.name,"name88"); //2,t1copy到t2 copyStruct(&t2,&t1); //3,释放 if(t1.name != NULL){ free(t1.name); t1.name = NULL; } if(t2.name != NULL){ free(t2.name); t2.name = NULL; } return 0;}
上面的代码运行到语句
if(t2.name != NULL){ free(t2.name); t2.name = NULL; }
的时候将会抛出错误. 这是一个经典的结构体深复制和浅复制的问题
上面的错误原因在于通过copyStruct函数的结构体copy属于浅复制.
在结构体中, 如果存在有指针变量, 浅复制仅仅复制指针的值,也就是指针的地址, 而指针指向的内容不进行复制. 所以t1.name和t2.name的值一样(浅赋值,复制指针的值), 这样他们指向同一块内存空间.
当对t1.name进行free后, 他们共同指向的内存空间被释放, 那么接下来在对t2.name进行释放的时候错误被抛出,也就是同一块内存被释放两次. 要避免上面的错误,我们需要使用深复制,不光复制内存地址,也把内存地址指向的内容复制一份
<二>深复制
所谓深复制,就是不但复制指针的值,而且指针指向的内容也复制一份
深复制代码如下:
#include "stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>//定义结构体Teachertypedef struct Teacher{ char* name; int age;}Teacher;//copy Teacher函数int copyStruct(Teacher* to, Teacher* from){ int retCode = 0; if(to == NULL || from == NULL){ retCode = -1; return retCode; } //下面的代码体现深复制操作 char *name = (char*) malloc(sizeof(char)*64); to->name = name; strcpy(to->name,from->name); (*to).age = (*from).age; return retCode;}//打印Teacher 结构体int printStruct(Teacher * t){ int retCode = 0; if(t== NULL){ retCode = -1; return retCode; } printf("name : %s, age: %d\n",t->name, t->age); return retCode;}int main(){ //1,声明t1 并且对t1进行初始化 Teacher t1 ; Teacher t2; t1.age = 88; char* name = (char*) malloc(sizeof(char)* 64); t1.name = name; strcpy(t1.name,"name88"); //2,t1copy到t2 copyStruct(&t2,&t1); //3,打印 printf("打印t1\n"); printStruct(&t1); printf("打印t2\n"); printStruct(&t2); //4,释放 if(t1.name != NULL){ free(t1.name); t1.name = NULL; } if(t2.name != NULL){ free(t2.name); t2.name = NULL; } return 0;}
0 0
- 结构体的浅copy和深copy
- 【C语言提高41】结构体的浅copy和深copy
- OC的深Copy和浅Copy
- 深copy和浅copy
- 深copy和浅copy
- OC 中 浅 copy 和 深 copy
- python 深copy和浅copy
- js浅copy和深copy
- python 浅copy 和 深copy
- 深copy,浅copy
- Java中类的引用Copy,浅Copy和深Copy
- copy和mutableCopy的深、浅拷贝
- 深copy 以及浅copy
- iOS 深copy 浅copy
- ios 深copy 浅copy
- 浅拷贝和深拷贝(shallow copy VS deep copy )
- 浅拷贝、深拷贝 Bitwise Copy和Memberwise Copy
- 深拷贝、浅拷贝、memberwise copy 和 bitwise copy
- 获得超级管理员的权限
- nginx + rtmp 搭建流媒体服务器
- 关于HttpServlet和Servlet以及doPost和doGet关系
- [剑指Offer]5.二维数组中的查找
- view.inflate异常:Binary XML file line #34: Error inflating class null
- 结构体的浅copy和深copy
- window.location.href和window.location.reload()方法在ajax提交后返回页面重新加载时候的区别
- 多次格式化namenode,datanode无法启动的解决办法
- Unable to find 'struts.multipart.saveDir' property setting.
- 利用mac的launchd,开机后定时启动shell脚本
- 【thinkphp3.2.x】thinkphp3.2.x中有关memcache缓存相关的文件
- 在JS中一个function函数要调用另一个函数里的变量。
- 深入Android 【一】 —— 序及开篇
- 【thinkphp3.2.x】thinkphp3.2.x中有关file文件缓存相关的文件