c语言结构体拷贝函数 c++ 结构体复制

C语言如何深拷贝结构体?

结构体并非一个赋值号就能copy的,需要手动设计自己将其中的每个基础类型进行复制:

创新互联建站是网站建设技术企业,为成都企业提供专业的成都网站设计、网站制作,网站设计,网站制作,网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制适合企业的网站。10年品质,值得信赖!

struct a a1,a2;

strcpy(a1.str,"123456789"); strcpy(a2.str,a1.str); strcpy(a1.str,"111111111");

在中间那句执行时,a1.str的内容是"123456789",因此赋值给a2.str的也是这个字符串

赋值完成后再改变a1时,a2与此无关了,会保持最后一次操作赋值的结果。

怎么把一个结构体中的数据复制到另一个相同类型的结构体数组中

可以类似BACNET_ADDRESS *P_dest[50];这样定义, 但要注意这样声明的是一个指针数组,即存50个BACNET_ADDRESS指针的数组,与你的需求不符。应该是直接定义BACNET_ADDRESS P_dest[50];这样P_dest中才能存储结构体。

C语言中结构体不能直接整体赋值。

可以使用memcpy函数:

void *memcpy(void *dest, const void *src, size_t n);

其中dest就是需要赋值到的地址, src就是复制源, n是需要复制的字节数。

所以是 memcpy(P_dest[i], dest, sizeof(dest));

修正:好吧,又查了下C是支持结构体直接赋值的,但如果结构体中有指针,将是非常不安全的,不过就你的代码来看是没问题的。

你代码不能复制的原因是两者的类型不一致,就是最开始说的P_dest实际上是一个指针数组,而赋值时要把一个结构体赋值给指针导致的错误。只要改下P_dest的声明就成了。

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

使用memcpy即可, 比如你另外建立一个结构体sortbook[1000]用来保存排序结果,将book中的第i个元素赋值到sortbook的第j个元素中

memcpy(sortbook[j], book[i], sizeof(struct book));

用这个函数需要#include string.h

函数原型

void *memcpy(void*dest, const void *src, size_t n);

功能

由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

头文件

#includestring.h

返回值

函数返回一个指向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语言 结构复制

是将a.arr[]中的每个元素复制给b.arr[]的每个元素,注意你定义的是一个结构体,c语言里面,定义的时候就已经分配了空间,所以b也是一个结构体,有自己的空间,有自己的首地址,和a的地址没有关系,也没有重叠,当你定义了S a={1,2,3};那么a.arr[0]=1;a.arr[1]=2;a.arr[3]=3;a.arr[4]一直到a.arr[9]都是0,这个是数组的赋值,部分赋值之后,没有被赋值的就是0,相信你明白这个,那么b=a;之后,b的情况和a的一样,b.arr[]中的值和a.arr[]中的值一样的,但是是两个不一样的结构体,但是如果:

S a={1,2,3},*b=a;

这个时候你定义的b是一个指向结构体的指针,现在把它初始化为指向a,那么这个时候是将a的地址也就是a.arr[]的地址赋值给了b。

S y(){……}; 这样是可以的,函数你要返回一个值,这个值是已经定义的结果或者是系统里面有的就可以的,这里你的函数y返回的是一个结构体,这个当然是可以的了

另外,你那么的改当然也是可以的了,结构体是你定义的,你可以改成任何的类型,只要不出现语法错误,可以的呀~~~,你返回什么那是函数里面要实现的功能,看你怎么实现了,和定义是没有必然的直接的联系的~~~


分享文章:c语言结构体拷贝函数 c++ 结构体复制
分享网址:http://myzitong.com/article/ddgpgje.html