其实这个代码写的可以,就是你写代码的时候不是成对编写,这就导致嵌套的层数多了,就有可能出问题了
这里你把这个写到for循环里面了 free(ts[i]->students);
如果成对编写,或者说照着申请内存的函数写释放内存的函数
就没问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Teacher
{
char *name;
char **students;
}STS;
void test1(STS ***ts)
{
STS **teacher = malloc(sizeof(STS *)*3);
for(int i=0;i<3;i++)
{
// 给每一个老师开辟空间
teacher[i] = malloc(sizeof(STS));
// 给老师姓名开辟空间
teacher[i]->name = malloc(32);
// 给老师姓名赋值
sprintf(teacher[i]->name,"teacher%d",i+1);
//给老师带的学生开辟空间
teacher[i]->students = malloc(sizeof(char *)*5);
for(int j=0;j<5;j++)
{
//给老师 i 带的每个同学的姓名开辟空间
teacher[i]->students[j] = malloc(32);
// 给每个学生姓名赋值
sprintf(teacher[i]->students[j],"%dstudent%d",i+1,j+1);
}
}
*ts = teacher;
}
void printfInformation(STS **teacher)
{
for(int i=0;i<3;i++)
{
printf("%s:\n",teacher[i]->name);
for(int j=0;j<5;j++)
{
printf("\t%s\n",teacher[i]->students[j]);
}
}
return ;
}
void freeSpace(STS **ts) //-----------------------------------------------这里
{
if(ts==NULL)
{
return ;
}
for(int i=0;i<3;i++)
{
//释放老师的名字
if(ts[i]->name!=0)
{
free(ts[i]->name);
ts[i]->name =NULL;
}
printf("teacher[%d]->name\n",i);
for(int j=0;j<5;j++)
{
// 释放学生的姓名
if(ts[i]->students[j]!=NULL) //--------------------------------第二次运行在这里报错
{
free(ts[i]->students[j]);
ts[i]->students[j] =NULL;
printf("\tteacher[%d]->students[%d]\n",i,j);
}
// 就这里的问题
#if 0
//释放学生
if(ts[i]->students!=0)
{
free(ts[i]->students);
ts[i]->students = NULL;
printf("\tteacher[%d]->students\n",i);
}
#endif
}
//释放学生
if(ts[i]->students!=0)
{
free(ts[i]->students);
ts[i]->students = NULL;
printf("\tteacher[%d]->students\n",i);
}
//释放每一个老师
if(ts[i]!=0)
{
free(ts[i]);
ts[i] =NULL;
}
}
free(ts);
ts =NULL;
}
int main()
{
STS ** ts =NULL;
test1(&ts); // 开辟空间 ,并赋值
printfInformation(ts); // 打印信息
freeSpace(ts); // err
ts =NULL;
return 0;
}
|