为什么在另一个函数中对内存malloc()进行free()处理会导致崩溃?

时间:2018-10-06 12:42:18

标签: c linked-list malloc free

我有一个链接的结构和功能列表,可以在其中添加,删除和创建数据。现在,当我尝试释放在create函数中分配的数据时,就会出现问题。如果我删除了我释放内存的那部分代码,但随后我不释放内存,则该程序可以正常工作。

结构:

typedef struct carinfo_t
{
    char * brand;
    char * model;
    int year;
    float value;
    struct carinfo_t * next;
} carinfo_t;

创建要添加到列表中的项目的函数:

struct carinfo_t *createCarinfo(char *brand, char *model, int year, float value)
{
    carinfo_t *newInfo = (carinfo_t *) malloc (sizeof(newInfo));
    newInfo->brand = malloc (sizeof(brand));
    newInfo->model = malloc (sizeof(model));

    if (!newInfo)
    {
        printf("createCarinfo: error: no space left\n");
    }
    else
    {
        strcpy(newInfo->brand, brand);
        strcpy(newInfo->model, model);
        newInfo->year = year;
        newInfo->value = value;
        newInfo->next = NULL;
    }
    return newInfo;
}

免费功能:

void freeCarinfo(struct carinfo_t *carinfo)
{
    if(carinfo->brand != 0)
    {
        free(carinfo->brand);
        carinfo->brand = 0;
    }
    if(carinfo->model != 0)
    {
        free(carinfo->model);
        carinfo->model = 0;
    }
    if(carinfo != 0)
    {
       free(carinfo);
       carinfo = 0;
    }
}

freeCarinfo()由我的removeCarinfo()函数调用,该函数基本上确保当我删除要查找的项目时,队列中的所有项目都将正确匹配。

我现在想做的是能够释放我给程序提供的内存

carinfo_t *newInfo = (carinfo_t *) malloc (sizeof(newInfo));
newInfo->brand = malloc (sizeof(brand));
newInfo->model = malloc (sizeof(model));

2 个答案:

答案 0 :(得分:3)

首先,当您为数据分配空间时,您犯了一个常见错误:

newInfo->brand = malloc (sizeof(brand));

这会分配足够的空间来存储指向char的指针,而不是数据本身。然后尝试将数据复制到其中:

strcpy(newInfo->brand, brand);

其中写入的数据可能比您为其创建的空间还要多。

您需要为整个字符串创建足够的空间,以及\0字符串结尾标记:

newInfo->brand = malloc (strlen(brand) + 1);

您也会在某个地方想要它:

#include <string.h>

第二,当您比较指向0的指针时,传统的C方法是使用NULL而不是0(或根本不使用)。 (在大多数情况下)具有相同的效果,但更清楚的是您正在进行指针比较。

第三,在freeCarinfo中使用carinfo,然后测试它是否为NULL0)。您确实需要知道是否可以使用值NULL来调用函数,在这种情况下,您最不使用carinfo->brand,或者在某些情况下绝对不能使用NULL不需要最后测试。

第四,正如其他地方的其他人所提到的,您正在分配newInfo,但分配的空间不足:

carinfo_t *newInfo = (carinfo_t *) malloc (sizeof(newInfo));

您可能需要的是:

carinfo_t *newInfo = malloc (sizeof(carinfo_t));

甚至更好:

carinfo_t *newInfo = malloc (sizeof(*newInfo));

总而言之,这里有很多错误,这就是为什么您发现它如此令人沮丧的原因。重新了解指针和动态分配,并根据所学知识重新查看代码。

答案 1 :(得分:0)

看看您的sizeof()运算符的返回值。我认为您会发现分配的字节数足以存储指针,而不是结构或字符本身。 sizeof()那样棘手。

malloc()实现可能会为内部内部管理分配一些额外的字节。如果分配的内存太少,并且开始覆盖这些内部结构,那么您将直接进入未定义的行为领域,这表明您尝试free()时该块,因为free()可能想使用该数据。

编辑:请参阅下面的讨论,以获取惯用的解决方案以及我推荐的@David Bowling讨论:carinfo_t *newInfo = malloc (sizeof *newInfo);