cpp关于结构体拷贝的问题

⌚Time: 2024-07-12 18:18:00

👨‍💻Author: Jack Ge

结构体拷贝:手动拷贝,等号赋值,memcpy拷贝

如果在结构体里面有数组

struct SA{
    char B[256];
};

可以直接等于号拷贝甚至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;
}

结果可以看到拷贝成功,而且数组地址并没有被拷贝,修改内容互不影响。

cello hello hello
pointer address:0x60fd80 0x60fc80 0x60fb80

你也可以手动拷贝内容

memset(&saa,0,sizeof(saa));
strcpy(saa.B,sa.B);

这些都能够实现没有问题的拷贝结果。


但是对于结构体里面有模板库的情况,需要手动拷贝,不能使用memcpy直接拷贝,会造成拷贝容器内的地址指针。如果一个结构体里面的容器被修改和销毁,其它的结构体里面的容器也会被修改和销毁。 正确的办法就是手动拷贝容器内元素

SB sb;
SB sbb;
for(...){
    sbb.vector[i] = sb.vector[i];
    ...
}

这种情况下结构体等号赋值是可以使用的,不会导致容器指针的地址被拷贝,就像上面的拷贝结构体数组一样的道理。但是等于号不会深拷贝容器里面的元素。