示例代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Teacher
{
char name[64];
int age;
char *alisname; // 一级指针
}Teacher;
// 浅拷贝
// 编译器的操作只会把指针变量的值,从from copy到 to,但不会把指针变量所指的内存空间给拷贝过去
void copyTeacher(Teacher *to, Teacher *from)
{
// *to = *from;
memcpy(to, from, sizeof(Teacher));
}
void main()
{
Teacher t1;
Teacher t2;
strcpy(t1.name, "name1");
t1.alisname = (char *)malloc(100);
strcpy(t1.alisname, "ssssss");
// t1赋值给t2
copyTeacher(&t1, &t2);
// 释放内存
if (t1.alisname != NULL)
{
free(t1.alisname);
t1.alisname = NULL;
}
if (t1.alisname != NULL)
{
free(t2.alisname);
t2.alisname = NULL;
}
system("pause");
return;
}
上面的代码一运行就会宕掉.
这就是典型的深拷贝与浅拷贝的问题
C++编译器只会进行浅拷贝,只会把指针的值拷贝过去,而不会把指针指向的内存空间拷贝过去,不会开辟新的内存空间.
C++的=操作默认是浅拷贝,只会把指针变量的值拷贝过去,不会把指针变量指向的内存空间的数据拷贝过去.
浅拷贝出现的场景是结构体中间套一个一级指针或者是二级指针
如何执行深拷贝
如果想执行深拷贝,那么要显示地分配内存
如下代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Teacher
{
char name[64];
int age;
char *alisname; // 一级指针
}Teacher;
void copyTeacher(Teacher *to, Teacher *from)
{
*to = *from;
// memcpy(to, from, sizeof(Teacher));
// 显示分配内存空间
to->alisname = (char *)malloc(100);
strcpy(to->alisname, from->alisname);
}
void main()
{
Teacher t1;
Teacher t2;
strcpy(t1.name, "name1");
t1.alisname = (char *)malloc(100);
strcpy(t1.alisname, "ssssss");
// t1赋值给t2
copyTeacher(&t2, &t1);
// 释放内存
if (t1.alisname != NULL)
{
free(t1.alisname);
t1.alisname = NULL;
}
if (t1.alisname != NULL)
{
free(t2.alisname);
t2.alisname = NULL;
}
system("pause");
return;
}