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