释放一系列结构

时间:2018-01-18 17:04:29

标签: c arrays struct malloc

我正在尝试释放一个结构数组,里面包含一个字符串数组,它们全都用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);
   }

}

1 个答案:

答案 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终止字符将被写入超出您已分配的内存范围,以及可能会被一些合法的所有者覆盖。

或者,您可以将mallocstrcpy调用合并到一个strdup调用中,该调用会分配适量的内存并为您复制现有字符串...

teach->courses[i]=strdup(temp);