c语言——结构体赋值(深拷贝和浅拷贝)

c语言——结构体赋值

结构体赋值1

struct Person
{
	char name[64];
	int age;
};

void test01()
{
	
	struct Person person1 = { "aaa", 20 };
	struct Person person2 = { "bbb", 30 };

	//赋值操作
	person1 = person2;

	printf("Name:%s Age:%d\n",person1.name,person1.age);
	printf("Name:%s Age:%d\n",person2.name,person2.age);
}

运行

Name:bbb Age:30
Name:bbb Age:30

结构体赋值2

如果结构体内部有指针指向堆内存,那么就不能使用编译器默认的赋值行为,应该手动控制赋值过程。

struct Teacher
{
	char *name;
	int age;
};

void test02()
{
	struct Teacher teacher1;
	teacher1.name = malloc(sizeof(char)* 64);
	memset(teacher1.name, 0, 64);
	strcpy(teacher1.name, "aaa");
	teacher1.age = 20;

	struct Teacher teacher2;
	teacher2.name = malloc(sizeof(char)* 128);
	memset(teacher2.name, 0, 128);
	strcpy(teacher2.name, "bbbbbbbbbbbbb");
	teacher2.age = 30;

	printf("Name:%s Age:%d\n", teacher1.name,teacher1.age);
	printf("Name:%s Age:%d\n", teacher2.name, teacher2.age);


	printf("teacher1 size: %d\n",sizeof(teacher1));
	printf("teacher2 size: %d\n", sizeof(teacher2));

	//赋值操作
	//不使用默认的结构体赋值行为
	//teacher1 = teacher2;
	//如果结构体内部有指针指向堆内存,那么就不能使用编译器默认的赋值行为,应该手动控制赋值过程。

	//----------------------------------------------

	if (teacher1.name != NULL)
	{
		free(teacher1.name);
		teacher1.name = NULL;
	}

	teacher1.name = malloc(strlen(teacher2.name) + 1);
	strcpy(teacher1.name, teacher2.name);
	teacher1.age = teacher2.age;

	//----------------------------------------------


	printf("---------------\n");
	printf("Name:%s Age:%d\n", teacher1.name, teacher1.age);
	printf("Name:%s Age:%d\n", teacher2.name, teacher2.age);

	//释放堆内存
	if (teacher1.name != NULL)
	{
		free(teacher1.name);
		teacher1.name = NULL;
	}

	if (teacher2.name != NULL)
	{
		free(teacher2.name);
		teacher2.name = NULL;
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章