结构体拷贝:手动拷贝,等号赋值,memcpy拷贝
如果在结构体里面有数组
可以直接等于号拷贝甚至memcpy函数拷贝,不会出现拷贝数组指针地址的问题。并且能够做到内容的完全拷贝
#include <iostream>
#include <string.h>
struct SA{
char B[256];
};
int main(){
SA sa;
SA saa;
SA saaa;
memset(&sa,0,sizeof(sa));
strcpy(sa.B,"hello");
//拷贝
saa =sa;//等于号
memcpy(&saaa,&sa,sizeof(sa));//memset拷贝
//修改
sa.B[0] = 'c';
//输出
std::cout<<sa.B<<" "<<saa.B<<" "<<saaa.B<<"\n";
std::cout<<"pointer address:"<<&sa.B<<" "<<&saa.B<<" "<<&saaa.B<<"\n";
return 0;
}结果可以看到拷贝成功,而且数组地址并没有被拷贝,修改内容互不影响。
你也可以手动拷贝内容
这些都能够实现没有问题的拷贝结果。
但是对于结构体里面有模板库的情况,需要手动拷贝,不能使用memcpy直接拷贝,会造成拷贝容器内的地址指针。如果一个结构体里面的容器被修改和销毁,其它的结构体里面的容器也会被修改和销毁。 正确的办法就是手动拷贝容器内元素
这种情况下结构体等号赋值是可以使用的,不会导致容器指针的地址被拷贝,就像上面的拷贝结构体数组一样的道理。但是等于号不会深拷贝容器里面的元素。