c语言如何实现结构体的深度复制
答案:5 悬赏:50 手机版
解决时间 2021-11-27 06:02
- 提问者网友:萌卜娃娃
- 2021-11-26 12:07
c语言如何实现结构体的深度复制
最佳答案
- 五星知识达人网友:愁杀梦里人
- 2021-11-26 13:23
使用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都不一定是数组,任意的可读写的空间均可。
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都不一定是数组,任意的可读写的空间均可。
全部回答
- 1楼网友:duile
- 2021-11-26 18:07
弱弱的问:啥是深度复制?追问递归复制。好像所谓不用指针。我也不清楚。递归复制。好像所谓不用指针。我也不清楚。
- 2楼网友:撞了怀
- 2021-11-26 16:34
这个关键看结构体的数据域,只要对其中的指针类型处理即可,拷贝其内容而非其本身,这样才释放指针是才不会重复释放同一内存区域追问大神能不能用代码举个例子追答
{
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的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);
}
- 3楼网友:末日狂欢
- 2021-11-26 15:34
结构体,不像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;
}
- 4楼网友:归鹤鸣
- 2021-11-26 14:18
//如有
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呢,像上面这样
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呢,像上面这样
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯