我试图理解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);
}
,这似乎是正确的。但是,当我决定创建用于分配/释放的函数时,双自由或损坏错误开始出现:
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
为什么会这样?提前谢谢。
最佳答案
void init_list(list_t * listptr, int size){
listptr = malloc(sizeof(list_t));
listptr->people = malloc(size * sizeof(person_t));
}
不正确。您正在函数中修改
listptr
。这不会改变list
中的任何main
。您需要删除该函数中的fhat changeslistptr
行。使用:// 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
的第二个调用。使用:// 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);
}
关于c - 由free()引起的内存损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34115737/