结构体拷贝:
1.结构体中的变量都是栈分配的存储空间,可以直接使用“=”拷贝
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);
}
2.如果是结构体中有成员变量是指针,需要注意先释放需要被填充的结构体变量中的指针变量,再拷贝。因为这种拷贝会导致2个问题,结构体变量的指针变量teacher2.name被释放2次,同时也会导致teacher1内存泄漏
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;
结构体拷贝
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
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);
}
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;
}
}
int main(){
//test01();
test02();
system("pause");
return EXIT_SUCCESS;
}
结构体嵌套一级指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Person
{
char *name;
int age;
};
//分配内存
struct Person** allocateSpace()
{
struct Person **temp = malloc(sizeof(struct Person *) * 3);
for (int i = 0; i < 3; ++i)
{
temp[i] = malloc(sizeof(struct Person));
temp[i]->name = malloc(sizeof(char)* 64);
sprintf(temp[i]->name, "Name_%d", i + 1);
temp[i]->age = 100 + i;
}
return temp;
}
//打印
void printPerson(struct Person **person)
{
if (NULL == person)
{
return;
}
for (int i = 0; i < 3; ++i)
{
printf("Name:%s Age:%d\n",person[i]->name,person[i]->age);
}
}
//释放内存
void freeSpace(struct Person **person)
{
if (NULL == person)
{
return;
}
for (int i = 0; i < 3; ++i)
{
if (person[i] == NULL)
{
continue;
}
if (person[i]->name != NULL)
{
printf("Name:%s的内存被释放!\n", person[i]->name);
free(person[i]->name);
person[i]->name = NULL;
}
free(person[i]);
person[i] = NULL;
}
free(person);
person = NULL;
}
void test()
{
struct Person **person = NULL;
person = allocateSpace();
printPerson(person);
freeSpace(person);
person = NULL;
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
结构体嵌套二级指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Teacher
{
char *name;
char **students;
};
int allocateSpace(struct Teacher ***temp)
{
if (NULL == temp)
{
//错误码 不同错误码表示不同错误
return -1;
}
struct Teacher **ts = malloc(sizeof(struct Teacher *) * 3);
for (int i = 0; i < 3; ++i)
{
//给老师结构体指针分配空间
ts[i] = malloc(sizeof(struct Teacher));
//给老师名字分配空间
ts[i]->name = malloc(sizeof(char) * 64);
sprintf(ts[i]->name, "Teacher_%d", i + 1);
//给学生指针分配内存
ts[i]->students = malloc(sizeof(char *)* 4);
for (int j = 0; j < 4; ++j)
{
ts[i]->students[j] = malloc(sizeof(char) * 64);
sprintf(ts[i]->students[j],"%s_Stu_%d",ts[i]->name,j + 1);
}
}
*temp = ts;
return 0;
}
void printTeachers(struct Teacher **teachers)
{
if (NULL == teachers)
{
return;
}
for (int i = 0; i < 3; ++i)
{
printf("%s\n", teachers[i]->name);
for (int j = 0; j < 4; ++j)
{
printf(" %s\n",teachers[i]->students[j]);
}
}
}
void freeSpace(struct Teacher **teachers)
{
if (NULL == teachers)
{
return;
}
for (int i = 0; i < 3; ++i)
{
if (teachers[i] == NULL)
{
continue;
}
if (teachers[i]->name != NULL)
{
free(teachers[i]->name);
teachers[i]->name = NULL;
}
for (int j = 0; j < 4; ++j)
{
if (teachers[i]->students[j] != NULL)
{
free(teachers[i]->students[j]);
teachers[i]->students[j] = NULL;
}
}
free(teachers[i]->students);
teachers[i]->students = NULL;
free(teachers[i]);
teachers[i] = NULL;
}
free(teachers);
teachers = NULL;
}
void test()
{
struct Teacher **teachers = NULL;
int ret = 0;
ret = allocateSpace(&teachers);
if (ret < 0)
{
printf("allocateSpace 函数调用出错!\n");
return;
}
//打印老师及其学生信息
printTeachers(teachers);
//释放内存
freeSpace(teachers);
teachers = NULL;
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}