C语言 释放结构数组



我正在尝试释放一个结构数组,其中包含一组字符串,它们都使用 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 coursesn");
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 %dn",i+1);
InputStr(temp);
teach->courses[i]=(char*)malloc(sizeof(char)*strlen(temp));
strcpy(teach->courses[i],temp);
}
}

首先,这条线在循环之外,所以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);

相关内容

  • 没有找到相关文章

最新更新