time: 2020.8.5
发现问题所在,应释放main函数p指向的内存,而不是freeTeacher函数里p指向的内存
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
// 4. 重写结构体嵌套一级指针老师和二级指针学生的代码
//结构体类型,每个导师有三个学生
typedef struct Teacher
{
char *tName; //导师
char **stu; //三个学生
int age;
}Teacher;
//在createTeacher中分配空间
int createTeacher(Teacher **p/out/, int n1, int n2)
{
if (p == NULL)
return -1;
Teacher *q = NULL;
q = (Teacher )malloc(n1 * sizeof(Teacher));
int i = 0;
int j = 0;
for (i = 0; i < n1; i++)
{
q[i].tName = (char )malloc(20 * sizeof(char));
}
for (i = 0; i < n1; i++)
{
q[i].stu = (char)malloc(n2 * sizeof(char ));
for (j = 0; j < n2; j++)
{
q[i].stu[j] = (char)malloc(30 * sizeof(char));
}
}
*p = q;
return 0;
}
//给成员赋值
void initTeacher(Teacher *p, int n1, int n2)
{
if (p == NULL)
return;
int i = 0;
int j = 0;
for (i = 0; i < n1; i++)
{
// printf(“第%d个导师的名字:”,i+1);
sprintf(p[i].tName, “小明%d”, i + 1);
//scanf("%s", &p[i].tName);
}
for (i = 0; i < n1; i++)
{
for (j = 0; j < n2; j++)
{
// printf("请输入第%d个导师的第%d学生的名字:",i+1,j+1);
// scanf("%s", &p[i].stu[j]);
sprintf(p[i].stu[j], "学生%d%d", i + 1, j + 1);
// printf("请输入第%d个导师的第%d学生的年龄:", i + 1, j + 1);
// scanf("%d", &p[i].age);
}
p[i].age = i + 1;
}
return 0;
}
//打印结构体成员信息
void printTeacher(Teacher *p, int n1, int n2)
{
if (p == NULL)
return;
int i = 0;
int j = 0;
for (i = 0; i < n1; i++)
{
printf("第%d个导师的名字:", i + 1);
printf("%s", p[i].tName);
printf("\n");
}
printf("\n");
printf("\n");
for (i = 0; i < n1; i++)
{
for (j = 0; j < n2; j++)
{
printf("第%d个导师的第%d学生的名字:", i + 1, j + 1);
printf("%s", p[i].stu[j]);
printf("\n");
}
printf("第%d个导师的年龄:", i + 1);
printf("%d", p[i].age);
printf("\n");
}
return 0;
}
//根据导师名字排序, 降序
void sortTeacher(Teacher *p, int n1)
{
if (p == NULL)
return;
Teacher t;
int i = 0;
int j = 0;
for (i = 0; i < n1 - 1; i++)
{
for (j = i + 1; j < n1; j++)
{
if (strcmp(p[i].tName, p[j].tName) < 0)
{
t = p[i];
p[i] = p[j];
p[j] = t;
}
}
}
return 0;
}
//释放空间,在函数内部把p赋值为NULL
void freeTeacher(Teacher **p, int n1, int n2)
{
if (p == NULL)
return;
int i = 0;
int j = 0;
Teacher *q = *p;
for (i = 0; i < n1; i++)
{
for (j = 0; j < n2; j++)
{
if (q[i].stu[j] != NULL)
{
free(q[i].stu[j]);
q[i].stu[j] = NULL;
}
}
}
for (i = 0; i < n1; i++)
{
if (q[i].stu != NULL)
{
free(q[i].stu);
q[i].stu = NULL;
}
if (q[i].tName != NULL)
{
free(q[i].tName);
q[i].tName = NULL;
}
}
if (*p != NULL)
{
free(*p);
*p = NULL;
}
return 0;
}
int main()
{
int ret = 0;
int n1 = 3; //导师个数
int n2 = 3; //学生
Teacher *p = NULL;
ret = createTeacher(&p, n1, n2);
if (ret != 0)
{
printf("createTeacher err:%d\n", ret);
return ret;
}
initTeacher(p, n1, n2); //给成员赋值
//打印成员,排序前
printf("排序前:\n");
printTeacher(p, n1, n2);
//根据导师名字排序, 降序
sortTeacher(p, n1);
//打印成员,排序后
printf("\n排序后:\n");
printTeacher(p, n1, n2);
//释放空间,在函数内部把p赋值为NULL
freeTeacher(&p, n1, n2);
system("pause");
return 0;
}