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;
	}

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