结构体嵌套指针
1.结构体嵌套一级指针
结构体定义如下:
struct Person{
char *name;
int age;
};
多次malloc,创建顺序:
malloc(sizeof(struct Person *));
使用struct Person **
类型变量去接收
malloc(sizeof(struct Person));
使用struct Person *
类型变量去接收
malloc(sizeof(char));
使用char *
类型变量去接收
多次free,释放顺序
free(char *);
free(struct Peron *);
free(struct Perons **);
代码如下:
堆区创建结构体指针数组
struct Person **allocateSpace(int len)
{
struct Person **temp = malloc(sizeof(struct Person *)*len);
for(int i = 0; i < len; 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 = 10 + i;
}
return temp;
}
堆区释放结构体指针数组
void freeSpace(struct Person **pArray,int len)
{
if(pArray == NULL || len < 0)
return;
for(int i = 0; i < 3; i++)
{
if(pArray[i]->name != NULL)
{
free(pArray[i]->name);
pArray[i]->name = NULL;
}
free(pArray[i]);
}
free(pArray);
pArray = NULL;
}
打印结构体指针数组指向的内容
void printPerson(struct Person **pArray,int len)
{
for(int i = 0; i < len; i++)
printf("姓名:%s 年龄:%d\n",pArray[i]->name,pArray[i]->age);
}
测试案例
void test()
{
struct Person **pArray = NULL;
pArray = allocateSpace(3);
printPerson(pArray,3);
free(pArray,3)
pArray = NULL;
}
2.结构体嵌套二级指针
结构体定义
struct Teacher{
char *name;
char **students;
};
malloc(sizeof(struct Teacher *));
使用struct Teacher **
类型变量去接收
代码如下:
堆区创建结构体指针数组
void allocateSpace(struct Teacher ***teachers,int teachers_len,int students_len)
{
if(teachers == NULL)
return;
//开辟内存
struct Teacber **ts = malloc(sizeof(struct Teacher*) * teachers_len);
//给每个老师分配内存
for(int i = 0; i < teachers_len; i ++)
{
ts[i] = malloc(sizeof(struct Teacher));
//给老师的姓名分配内存
ts[i]->name = malloc(sizeof(char)*64);
sprintf(ts[i]->name,"Teacher_%d",i+1);
tsp[i]->students = malloc(sizeof(char*)* students_len);
for(int j = 0; i < students_len; j++)
{
ts[i]->students[j] = malloc(sizeof(char)*64);
sprintf(ts[i]->students[j],"%s_Student_%d",ts[i]->name,j+1);
}
}
*teachers = ts;
}
释放结构体指针数组指向的内存
void freeSpace(struct Teacher **pArray,int teachers_len,int students_len)
{
if(pArray == NULL)
return;
for(int i = 0; i < teachers_len; i++)
{
for(int j = 0; j < students_len; j++)
{
//释放学生的姓名
if(pArray[i]->students[j] != NULL)
{
free(pArray[i]->students[j]);
pArray[i]->students[j] = NULL;
}
}
//释放老师的姓名
if(pArray[i]->name != NULL)
{
free(pArray[i]->name);
pArray[i]->name = NULL;
}
//释放学生的数组
if(pArray[i]->students != NULL)
{
free(pArray[i]->students);
pArray[i]->students = NULL;
}
//释放老师
if(pArray[i] != NULL)
{
free(pArray[i]);
pArray[i] = NULL;
}
}
//释放老师的数组
free(pArray);
pArray = NULL;
}
打印结构体指针数组指向的内容
void printTeachers(struct Teacher **pArray,int teachers_len,int students_len)
{
if(pArray == NULL)
return;
for(int i = 0; i < teachers_len; i++)
{
printf("%s",pArray[i]->name);
for(int j = 0; j < students_len; j++)
{
printf(" %s\n",pArray[i]->students[j]);
}
}
}
测试函数
void test()
{
struct Teacher **pArray == NULL;
allocateSpace(&pArray,3,4);
printTeachers(pArray,3,4);
freeSpace(pArray);
pArray = NULL;
}