我试图了解C中的动态内存分配是如何工作的。所以我编码了这个:
typedef struct person{
int id;
int credit;
}person_t;
typedef struct list{
int id;
person_t * people;
}list_t;
int main(){
list_t * list;
list = malloc(sizeof(list_t));
list->people = malloc(10 * sizeof(person_t)); //list for 10 people
free(list->people);
free(list);
}
,这似乎是正确的。但是,当我决定为allocate \ deallocation创建函数时,会出现双重释放或损坏错误:
void init_list(list_t * listptr, int size){
listptr = malloc(sizeof(list_t));
listptr->people = malloc(size * sizeof(person_t));
}
void clear_list(list_t * listptr){
free(listptr->people);
free(listptr);
}
int main(){
list_t list;
init_list(&list, 10); //list for 10 people
clear_list(&list);
}
输出:
Error in ./list: double free or corruption (out) : 0x00007ffc1b3fba70
为什么会这样?提前谢谢。
答案 0 :(得分:1)
void init_list(list_t * listptr, int size){
listptr = malloc(sizeof(list_t));
listptr->people = malloc(size * sizeof(person_t));
}
不正确。您正在修改函数中的listptr
。这不会改变list
中main
的任何内容。您需要删除该函数中更改listptr
的行。使用:
// listptr is already a valid pointer.
// There is no need to allocate memory for it.
void init_list(list_t * listptr, int size){
listptr->people = malloc(size * sizeof(person_t));
}
clear_list
中有一个更糟糕的错误。
void clear_list(list_t * listptr){
free(listptr->people);
free(listptr);
}
您正在通过调用free
未分配的指针调用malloc
。 listptr
是指向main
中堆栈中创建的对象的指针。删除对free
的第二次调用。使用:
// listptr is a pointer to an object on the stack in main.
// Trying to call free on it is an error.
void clear_list(list_t * listptr){
free(listptr->people);
}