c语言——结构体嵌套二级指针
如果一个结构体内嵌套二级指针了二级指针,这里的students为二级指针,也对应了一对多的关系,一个老师,多个学生。
struct Teacher
{
char *name;
char **students;
};
我们知道,二级指针指向一级指针的地址,三级指针指向二级指针的地址
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 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;
}
运行
Teacher_1
Teacher_1_Stu_1
Teacher_1_Stu_2
Teacher_1_Stu_3
Teacher_1_Stu_4
Teacher_2
Teacher_2_Stu_1
Teacher_2_Stu_2
Teacher_2_Stu_3
Teacher_2_Stu_4
Teacher_3
Teacher_3_Stu_1
Teacher_3_Stu_2
Teacher_3_Stu_3
Teacher_3_Stu_4