c语言结构体复制
① c语言,请问如何将结构体中的结构体拷贝到内存
1、可以直接用=符号拷贝,但它有一个条件,这里的赋初值不别的数据类型(如
int
a;a=5;)它必须是对结构体中的每个成员以此赋值的。将一个结构体变量的值直接赋给另外一个结构体变量的时候,这两个结构体必须是相同结构体名。
2、不同类型的话,也可以用,一般在做通信方面用的比较多。因为处理协议。发包方按照某个协议结构体填充后,发送;接收方收到时其实是一个很长的字符串。那接收方一般用这种方法:结构体
=
(结构体)&字符串,
当然接收方的结构体跟发送方的结构体不一定一样,都是根据协议来的。
② 怎么把结构体里面的数据复制到一个数组里面
可以类似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的声明就成了。
③ 如何给结构体里的数组复制啊
可以啊!你看!
#include<iostream>
#include<stdio.h>
usingnamespacestd;
structStu
{
intscore[10];
};
intmain()
{
Stus[2];
for(inti=0;i<2;i++)
for(intj=0;j<10;j++)
scanf("%d",&s[i].score[j]);
//cin>>s[i].score[j];
for(inti=0;i<2;i++)
{
for(intj=0;j<10;j++)
cout<<s[i].score[j]<<"";
cout<<endl;
}
return0;
}
④ C语言 结构复制
同一结构体类型的变量间可以互相赋值。
~~~~定义一个结构 typedef struct SA{ int arr[10];}S;
~~~~定义两个变量 S a={1,2,3},b=a;
以上赋值是合法的。
是将a.arr[]中的每个元素复制给b.arr[]的每个元素;
而不是将a.arr[]的首地址复制给b.arr[]的首地址。
⑤ 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语言如何深拷贝结构体
结构体并非一个赋值号就能的,需要手动设计自己将其中的每个基础类型进行复制:
struct a a1,a2;
strcpy(a1.str,"123456789"); strcpy(a2.str,a1.str); strcpy(a1.str,"111111111");
在中间那句执行时,a1.str的内容是"123456789",因此赋值给a2.str的也是这个字符串
赋值完成后再改变a1时,a2与此无关了,会保持最后一次操作赋值的结果。
⑦ 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指向地址为起始地址的空间内。
头文件
#include<string.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语言strcpy将一个结构体的数据复制到另一个后,出问题了
这属于C++的范畴,虽然我C++学得也是半斤八两,但是这段代码我还是基本上过得去。
我假设你是有一定的C编程基础,所以就只回答你空间描述的不懂的地方了,每句都翻译枯燥而且也会感觉不知所云。还有什么不懂的,欢迎提问,我有足够的耐性和信心让你搞明白,呵呵^!^
C++中主要是比C多了面向对象的概念。
#include <*****> 表示的是将*****头文件包含进来
#include "*****" 功能一样,只是他们索引文件的方式不一样,初学者不必深究。
*****头文件里面定义了常用的一些预处理,结构体,类等等,可以方便大家直接使用不再定义他们。你可以搜索*****找到它打开看看里面的内容,不要随意修改他们哦,否则你以后写程序要出问题的哟,呵呵。
using namespace std;
表示要用到的一些关键字所在的命名空间
因为用到了cout所以必须加上这句话。
定义了一个Student类,定义类的时候除了可以定义一些变量,还可以定义一些接口,变量和接口都可以用private,public,protected来定义访问 以及 继承权限的。
其实接口更直接一点就是一个函数,或者说成指向函数的指针变量也可以,主要看你怎么理解了。
int student::jud() ::表示域限定符,用::定义了一个接口(也就是函数),表示这个函数是属于student类的。
同时student类中还定义了一个student()函数,是构造函数,语法规定必须和类名字相同。构造函数的主要作用是类实例化的时候初始化变量,也就是在创建对象的要用到的。
loop: printf("****");
loop:表示的是一个标号,后面用goto loop 跳转到loop:位置执行printf("****");
你完全可以把loop替换成别的东西,比如xunhuan,呵呵
cout 用来控制输出
<<连接各个参数,
cint 用来控制输入
>>连接各个参数。参数和printf ,scanf 是相一致的。
system("***"); 可以调用一些命令行,如cls 清屏 ,pause 暂停 还可以创建进程等等。
好像差不多没了,其他东西基本都是C语言知识了
PS:
其实C++的类和C语言的结构体非常相似,类可以定义函数接口,但是结构体不行
其实我们在结构体中也可以变相的实现定义函数的嘛,比如定义一个函数指针变量。
唯一不同的就是C++的类多了继承的概念,一个类可以继承另一个类的一些属性
而且在继承的过程中还有private,public,protected等权限。
当然C++除了类之外还有STL等一些比较高级的东东值得学习,巧妙的使用他们可以加快项目进度,提升项目效率,C++真的是很好很强大。
⑨ C语言怎么将结构体的内容复制到另一个结构体中
C并不支持结构体变量的直接赋值,
一般采用memcpy(&a,&b,sizeof(a))的方式
⑩ C语言中结构体可以通过=号直接复制吗
标准的C语言是不可以的,但是如果你的文件的扩展名是.cpp
这就没问题了。