结构体知识梳理4-浅拷贝深拷贝
2014-06-19 11:43
211 查看
应用场景分析,我们希望对一个学生的信息做备份
以上代码,stu1 ,stu2 分别存储一份学生的信息,可以实现学生信息的备份
我们画内存图如下:
对于以上代码来说,用数组存储姓名,这样字符串的最大长度已经固定,如果字符串长度超过数组长度,则会出现问题。
我们写以下测试代码
注意这里并没有把 名字复制一份存储下来,而只是stu2.name 指针 和 stu1.name 指针存储了同一个地址,如果一旦 free(stu1.name),则这时候stu2.name也不能使用了,并没有把字符串复制存储下来,这种现象叫做浅拷贝。
我们希望对学生的有效信息有两份,因此内存图应该是如下:
这种现象叫做深拷贝。
根据以上需求我们写代码如下
以上代码请大家分析补充完整。
代码一
typedef struct student{ int num; int age; char name[10]; }s_stu,*p_stu; //stu1 stu2 有独立的内存空间,存储 num age name s_stu stu1; s_stu stu2; stu1.num = 1; stu1.age = 1; strcpy(stu1.name,"lilei"); //以下做的是memcpy(&stu2,&stu1,sizeof(s_stu)) stu2 = stu1; printf("stu2.num = %d",stu2.num); printf("stu2.age = %d",stu2.age); printf("stu2.name = %s",stu2.name); stu1 和stu2分别有两个char name[10]数组存储字符串
以上代码,stu1 ,stu2 分别存储一份学生的信息,可以实现学生信息的备份
我们画内存图如下:
对于以上代码来说,用数组存储姓名,这样字符串的最大长度已经固定,如果字符串长度超过数组长度,则会出现问题。
代码二
因此我们需要根据字符串的长度来动态分配内存空间,我们定义以下结构体typedef struct student{ int num; int age; char *name; }s_stu,*p_stu;
我们写以下测试代码
char *buff = "lilei";//需要存储的学生的名字 s_stu stu1; s_stu stu2; stu1.num = 1; stu1.age = 1; stu1.name = malloc(strlen(buff))+1;//根据字符窜长度来分配相应内存。 strcpy(stu1.name,buff); //以下做的是memcpy(&stu2,&stu1,sizeof(s_stu)) stu2 = stu1; printf("stu2.num = %d",stu2.num); printf("stu2.age = %d",stu2.age); printf("stu2.name = %s",stu2.name); //到这里打印没有问题。到此,我们画内存图如下:
注意这里并没有把 名字复制一份存储下来,而只是stu2.name 指针 和 stu1.name 指针存储了同一个地址,如果一旦 free(stu1.name),则这时候stu2.name也不能使用了,并没有把字符串复制存储下来,这种现象叫做浅拷贝。
我们希望对学生的有效信息有两份,因此内存图应该是如下:
这种现象叫做深拷贝。
根据以上需求我们写代码如下
//假定能够复制的前提是 src 已经存储了学生信息 void stucpy(p_stu dest,const p_stu src) { int len = 0; //检查dest ,src 不为null //检查src->name 不为null len = strlen(src->name)+1; //这里为什么要释放? if(dest->name!=NULL) { free(dest->name); } dest->name = (char*)malloc(len); //检查dest->name 不为null strcpy(dest->name,src->name); dest->num = src->num; dest->age = src->age; }
以上代码请大家分析补充完整。
相关文章推荐
- 48张帮助程序员梳理知识框架结构图谱
- 03-Servlet 体系结构知识梳理
- 梳理知识结构
- 从前到后的知识结构梳理
- 知识结构梳理
- 微信小程序知识结构简单梳理
- plsql知识梳理-oracle物理和逻辑结构
- 开端-对现有知识结构和项目的梳理
- 写给自己,梳理一下我现在对前端知识结构的理解
- IT知识体系结构图
- JQuery基础知识梳理篇
- java知识结构
- C#基础知识整理:C#类和结构(3)
- WPF - Command基础知识梳理
- shell基础知识梳理二
- IEC61850变电站基本通信结构-原理和模型_8相关知识
- [数据结构与算法]编译原理文法知识
- 知识梳理------信号
- 找到匹配文件拷贝出来(带原始目录结构)
- 软件工程师必须掌握的知识结构