C语言中结构体的深拷贝和浅拷贝

C语言中结构体的深拷贝和浅拷贝

一、结构体的浅拷贝
1.结构体的浅拷贝是把一个结构体的内容拷贝到另外一个结构体,仔细看代码就可以

#include <stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct teacher
{
	char *name;
	int age;
}teacher;
int main()
{
	teacher t1;
	t1.name = (char*)malloc(30);//给name动态分配空间
	strcpy(t1.name, "liming");//把文字常量区的内容拷贝给t1.name
	t1.age = 22;
	teacher t2 = t1;//结构体的浅拷贝
	printf("%s %d", t2.name, t2.age);
	if (t1.name != NULL) //释放分配给t1.name 的堆区空间
	{
		free(t1.name);
		t1.name = NULL;
	}                 
	//C语言中不能存在二次释放,会导致程序崩溃,画出内存图,可以看到t1.name和t2.name指向同一内存
	//if (t2.name != NULL)         
	//{
	//	free(t2.name);
	//	t2.name = NULL;
	//}
	return 0;
}

在这里插入图片描述2.结构体的深拷贝
给t2单独分配一块空间进行拷贝,代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef struct teacher
{
	char *name;
	int age;
}teacher;
int main()
{
	teacher t1;
	t1.name = (char*)malloc(30);
	strcpy(t1.name, "lily");
	t1.age = 22;
	teacher t2;
	t2 = t1;
	t2.name = (char*)malloc(30);//给t2.name重新分配空间
	strcpy(t2.name, t1.name);
	printf("%s %d", t2.name, t2.age);
	if (t1.name != NULL)//释放t1.name和t2.name的堆区空间
	{
		free(t1.name);
		t1.name = NULL;
	}
	if (t2.name != NULL)
	{
		free(t2.name);
		t2.name = NULL;
	}
	return 0;
}

在这里插入图片描述深拷贝与浅拷贝在C语言中意义不大,只是做一个简单的分析。

猜你喜欢

转载自blog.csdn.net/a_hang_szz/article/details/88572706