我正在尝试释放一个结构数组,里面包含一个字符串数组,它们全都用malloc分配,程序工作,直到我尝试用我制作的函数释放它,然后我得到核心转储
这是我的结构: 名称分配的数组,字符串 - 字符串和教学是一个分配的结构数组,我试图逐个释放。 struct date
{
int day,month,year;
};
struct lecturer
{
char * name;
struct date birthdate;
int num_of_courses;
char ** courses;
};
这是我的功能:
void freeAndExit(struct lecturer* teach,int num)
{
int i,j;
for(i=ZERO;i<num;i++)
{
free(teach[i]->name);
for(j=ZERO;j<teach[i]->num_of_courses;j++)
free(teach[i]->courses[j]);
}
free (teach[i]);
}
这就是我从main()
调用我的函数的方法freeAndExit(&teach,numTeach);
任何想法? 编辑: 这就是我如何输入我的结构
void InputLecturer(struct lecturer** teach,int num)
{
int i;
char temp[SIZE];
getchar();
teach=(struct lecturer*)malloc(sizeof(struct lecturer)*num);
for(i=ZERO;i<num;i++)
{
printf("Please enter the lecturers name:\n");
InputStr(temp);
(*teach)[i].name=(char*)malloc(sizeof(char)*strlen(temp));
strcpy((*teach)[i].name,temp);
printf("Please enter the birtday date:|Day|Month|Year|\n");
scanf(" %d %d %d",&(*teach)[i].birthdate.day,&(*teach)[i].birthdate.month,&(*teach)[i].birthdate.year);
printf("Enter the number of courses\n");
scanf("%d",&(*teach)[i].num_of_courses);
getchar();
InputCourses(&(*teach)[i],(*teach)[i].num_of_courses);
}
}
void InputCourses(struct lecturer* teach,int num)
{
int i;
char temp[SIZE];
teach->courses=(char**)malloc(sizeof(char)*num);
for(i=ZERO;i<num;i++)
{
printf("Please enter course name number %d\n",i+1);
InputStr(temp);
teach->courses[i]=(char*)malloc(sizeof(char)*strlen(temp));
strcpy(teach->courses[i],temp);
}
}
答案 0 :(得分:1)
首先,此行在循环之外,因此i
的值将超出为teach
分配的范围。其次,teach[i]
是struct lecturer
- 所以它无论如何也没有分配内存,所以没有任何东西可以免费。
free (teach[i]);
需要释放的是teach
本身,所以用这个替换上面的行。
free (teach);
您还应确保为任何字符串分配足够的内存 - 它们总是需要比您认为存储终止NUL字符所需的内存多一个。所以,例如,这一行
teach->courses[i]=(char*)malloc(sizeof(char)*strlen(temp));
应该是
teach->courses[i]=malloc(sizeof(char)*(strlen(temp)+1));
(注意:您不需要在C中投射malloc
的返回值
没有为字符串分配足够的空间调用未定义的行为,就像您将strcpy
字符串放入新分配的内存中一样,NUL终止字符将被写入超出您已分配的内存范围,以及可能会被一些合法的所有者覆盖。
或者,您可以将malloc
和strcpy
调用合并到一个strdup
调用中,该调用会分配适量的内存并为您复制现有字符串...
teach->courses[i]=strdup(temp);