参考:https://www.cnblogs.com/123wh/p/14383142.html
浅拷贝:对存在指针成员的结构体直接赋值,导致结构体中的指针变量指向同一地址,在释放时重复释放同一段空间(段错误)
深拷贝:为新结构体变量的成员指针,分配独立的空间
补充:free只能free堆区空间,否则段错误
#include<stdio.h>
#include<stdlib.h>
typedef struct stu
{
char* name;
int score;
}STU;
int main(int argc, char const *argv[])
{
STU lihua,xiaoming;
lihua.name ="lihua";
lihua.score=99;
printf("%s",lihua.name);
if (NULL!=lihua.name)
{
free(lihua.name);
lihua.name=NULL;
}
return 0;
}
浅拷贝实例(核心已转储):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stu
{
char* name;
int score;
}STU;
int main(int argc, char const *argv[])
{
STU lihua;
lihua.name=(char*)malloc(100);
strcpy(lihua.name,"lihua");
STU xiaoming;
xiaoming.name=(char*)malloc(100);
strcpy(xiaoming.name,"xiaoming");
lihua=xiaoming;//让lihua.name的指针指向了xiaoming.name的空间
printf("%s\n",lihua.name);
if (NULL!=lihua.name)//实则释放当初xiaoming.name所指向的空间
{
free(lihua.name);
lihua.name=NULL;
}
if (NULL!=xiaoming.name)//再次释放xiaoming.name所指向的空间
{
free(xiaoming.name);
xiaoming.name=NULL;
}
return 0;
}
深拷贝实例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stu
{
char* name;
int score;
}STU;
int main(int argc, char const *argv[])
{
STU lihua;
lihua.name=(char*)malloc(100);
strcpy(lihua.name,"lihua");
STU xiaoming;
#if 0
//浅拷贝
xiaoming=lihua;
#endif
#if 1
//深拷贝
xiaoming.name=(char*)malloc(100);
strcpy(xiaoming.name,lihua.name);
#endif
printf("%s\n",xiaoming.name);
if (NULL!=lihua.name)
{
free(lihua.name);
lihua.name=NULL;
}
if (NULL!=xiaoming.name)
{
free(xiaoming.name);
xiaoming.name=NULL;
}
return 0;
}