1.问题引入(指针变量作为结构体成员)
typedef struct
{
int num;
char *name;//指针变量作为 结构体的成员
}DATA;
void test01()
{
DATA data={100,"hehehehaha"};
printf("%d\n",sizeof(DATA));//8字节
printf("num = %d\n",data.num);
//指针变量作为结构体的成员 保存的是空间的地址
printf("name = %s\n",data.name);
2、指针变量 作为结构体的成员 操作前 必须有合法的空间
void test02()
{
DATA data;
printf("%d\n",sizeof(DATA));
printf("num = %d\n",data.num);
//指针变量 作为结构体的成员 操作前 必须有合法的空间
//data.name = "hehe";
//给name 事先申请 一块 堆区空间
data.name = (char *)calloc(1,10);
strcpy(data.name,"hahaha");
printf("name = %s\n",data.name);
if(data.name != NULL) //如果name指向堆区空间 一定要记得释放
{
free(data.name);
data.name = NULL;
}
}
3、指针变量 作为结构体的成员 结构体变量间的赋值操作 容易导致“浅拷贝”发生
void test03()
{
DATA data1;
DATA data2;
data1.num = 100;
data1.name = (char *)calloc(1,10);
strcpy(data1.name,"my data");
printf("data1:num = %d, name = %s\n",data1.num, data1.name);
//指针变量 作为结构体的成员 结构体变量间的赋值操作 容易导致“浅拷贝”发生
data2 = data1;//“浅拷贝”
printf("data2: num = %d, name = %s\n",data2.num, data2.name);
if(data1.name != NULL)
{
free(data1.name);
data1.name = NULL;
}
if(data2.name != NULL)
{
free(data2.name);
data2.name = NULL;
}
}
此代码由于指针变量作为结构体成员 在结构体之间相互赋值时 导致“浅拷贝”发生
最终运行结果会出现段错误。
上面说到指针变量作为结构体的成员,在结构体变量间的赋值操作时容易导致“浅拷贝”发生。为了解决这个问题
下面来大致说一下深拷贝:
所谓深拷贝就是在结构体变量赋值时为指针变量申请独立的空间
程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int num;
char *name;
}DATA;
void test01()
{
DATA data1;
DATA data2;
data1.num = 100;
data1.name = (char *)calloc(1,12);
strcpy(data1.name, "my data");
data2.num = data1.num;
data2.name = (char *)calloc(1,12);//为结构体变量 申请 独立的空间
strcpy(data2.name, data1.name);
printf("data1:num = %d, name=%s\n", data1.num, data1.name);
printf("data2:num = %d, name=%s\n", data2.num, data2.name);
if(data1.name != NULL)
{
free(data1.name);
data1.name = NULL;
}
if(data2.name != NULL)
{
free(data2.name);
data2.name = NULL;
}
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
运行结果
总结:
前提是 指针变量作为结构体的成员
所谓浅拷贝就是两个结构体变量中的指针成员指向同一块堆区空间;
深拷贝就是两个结构体变量中的指针成员分别指向各自的堆区空间。