|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
调试在 freeSpace里面报错,j =2 时运行在 if(ts[i]->students[j]!=NULL) 报错。
感谢感谢感谢
- #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(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;
- }
复制代码
其实这个代码写的可以,就是你写代码的时候不是成对编写,这就导致嵌套的层数多了,就有可能出问题了
这里你把这个写到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;
- }
复制代码
|
|