区别
- 浅拷贝与C++中类的默认复制构造函数的位拷贝类似
- 浅拷贝是将一个结构体里面的值完全赋给另一个结构体,当结构体中含有指针变量时,浅拷贝只会拷贝指针所指向的空间地址值,不会自动分配内存(即原指针与拷贝指针都指向同一块内存,一不小心可能犯对同一块动态内存进行多次释放的错误)
- 深拷贝可以自动为指针分配内存(即原指针与拷贝指针所指向的内存空间不同,只是内存中存的值相同,可以避免对同一块动态内存进行多次释放的错误)
- 如果结构体内无指针变量,浅拷贝与深拷贝效果相同
示例
定义结构体
typedef struct Data
{
int a;
int* p;
}Data;
浅拷贝
int main()
{
Data data;
data.a = 2;
data.p = (int*)malloc(sizeof(int));
*data.p = 1;
Data copy;
copy = data; //浅拷贝 data.p与copy.p指向同一块内存
free(data);
free(copy); //报错,对一块内存进行了两次释放
}
深拷贝
int main()
{
Data data;
data.a = 2;
data.p = (int*)malloc(sizeof(int));
*data.p = 1;
Data copy;
//深拷贝
copy.a = data.a;
copy.p = (int*)malloc(sizeof(int)); //单独分配内存
*copy.p = *data.p;
free(data);
free(copy);
}