我试图理解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/

10-10 22:58