十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
结构体并非一个赋值号就能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的声明就成了。
使用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都不一定是数组,任意的可读写的空间均可。
是将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返回的是一个结构体,这个当然是可以的了
另外,你那么的改当然也是可以的了,结构体是你定义的,你可以改成任何的类型,只要不出现语法错误,可以的呀~~~,你返回什么那是函数里面要实现的功能,看你怎么实现了,和定义是没有必然的直接的联系的~~~