我正在尝试释放一个结构数组,其中包含一组字符串,它们都使用 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 终止字符将被写入超出已分配的内存范围,并且稍后可能会被某些合法所有者覆盖。
或者,您可以将malloc
和strcpy
调用合并为一个对strdup
的调用,该调用分配适量的内存并为您复制现有字符串...
teach->courses[i]=strdup(temp);