永发信息网

c语言如何实现结构体的深度复制

答案:5  悬赏:50  手机版
解决时间 2021-11-27 06:02
c语言如何实现结构体的深度复制
最佳答案
使用memcpy即可, 比如你另外建立一个结构体sortbook[1000]用来保存排序结果,将book中的第i个元素赋值到sortbook的第j个元素中
memcpy(&sortbook[j], &book[i], sizeof(struct book));
用这个函数需要#include

  函数原型
  void *memcpy(void*dest, const void *src, size_t n);
  功能
  由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
  头文件
  #include
  返回值
  函数返回一个指向dest的指针。
  说明
  1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。
  2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。

  memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
  例:
  char a[100], b[50];
  memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。
  strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:
  char a[100], b[50];
  strcpy(a,b);
  3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
  //注意,source和destin都不一定是数组,任意的可读写的空间均可。
全部回答
弱弱的问:啥是深度复制?追问递归复制。好像所谓不用指针。我也不清楚。递归复制。好像所谓不用指针。我也不清楚。
这个关键看结构体的数据域,只要对其中的指针类型处理即可,拷贝其内容而非其本身,这样才释放指针是才不会重复释放同一内存区域追问大神能不能用代码举个例子追答

最简单的例子便是C的string的实现

struct CString
{
char * ptr;
int size;
};

void shallowCopy(struct CString * dst, struct CString * src)
{
dst->size = src->size;
dst->ptr = src->ptr;
}

void depthCopy(struct CString * dst, struct CString * src)
{
if(dst->size != src->size)
{
dst->size = src->size;
free(dst->ptr);
dst->ptr = NULL;
dst->ptr = (char *)calloc(dst->size + 1, sizeof(char));
}
strcpy(dst->ptr, src->ptr);
}

结构体,不像C++中的类,可以通过修改拷贝构造函数来实现深拷贝。


结构的的深拷贝,只能写一个单独的函数来实现了。


下面的是一个例子:

#include
#include

struct Student{
char * firstName;
int num;
};

void CreateStudent(Student * tar){
tar->firstName = new char[10];
}
void DeleteStudent(Student * tar){
delete tar->firstName;
}
void DeepCopyStudent(const Student * src, Student* tar){
strcpy(tar->firstName, src->firstName);
tar->num = src->num;
}
void PrintStudent(const Student * tar){
printf("%s ", tar->firstName);
}

int main(){
Student *s1, *s2;
s1 = new Student();
s2 = new Student();
CreateStudent(s1);
char *name = "Hello";
strcpy(s1->firstName, name);
CreateStudent(s2);
DeepCopyStudent(s1, s2);
PrintStudent(s1);
DeleteStudent(s1);
delete s1;
PrintStudent(s2); //在删除s1之后,s2仍然可以正常输出,说明深拷贝
DeleteStudent(s2);
delete s2;


return 0;
}
//如有
struct A {  int i;  char *pc;};
//并定义
struct A st = { 0, "a const string ptr" };
//则可以用
struct A *p = (struct A *) malloc(sizeof(struct A));*p = st;
//完成复制。用
free(p);
 p = NULL;
//完成释放。追问这不是浅度复制吗追答//如有
struct A {  int i;  char *pc;};
//并定义
struct A *st;
.........
//则可以用
struct A *p = (struct A *) malloc(sizeof(struct A));
memcpy(p,st,sizeof(st))
//完成复制。用
free(p);
 p = NULL;
//完成释放。

使用memcpy呢,像上面这样
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
柳宗元在江雪这首诗以如画之笔描绘了一副( )
浦城桂都国际大酒店地址在什么地方,想过去办
高斯混合模型的初始化有哪些好的方法
怎样用变频器来辨识电机
断骨增高跟激素增高选哪个
求上外出版社全新版大学英语综合教程第一册课
成语博采什么什么
社旗有个小三,我想爆张照,可以不
网络财务的含义
汽车气门响怎么判断
家用车涡轮还是自吸好
当股市涨到3500点,是什么意思?
有没有人得过腰椎间盘突出啊,要死了
220v的电流怎样算功率3500w
头顶一块很油,发尾很干,经常掉发
推荐资讯
《工作目标如何有效制定与执行》
钢铁在寒冷的空气里易碎吗
高层板楼一层如何装修
VC6.0再次安装问题
1978年农历11月24日出生是什么星座
急求几张比较清晰的直升机主旋翼系统的图片,
天没降大任于我,照样苦我心志,劳我筋骨。
寻找解诗高手:鲈鱼作脍菊花黄 美酒盈樽近晚凉
家庭污水重复利用
这题怎么解决
比一比,再组词。县可以组什么词。
1.渠水涌波碎月影,只为月影存心中.什么意思
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?