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