我有一个链接的结构和功能列表,可以在其中添加,删除和创建数据。现在,当我尝试释放在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));
答案 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
,然后测试它是否为NULL
(0
)。您确实需要知道是否可以使用值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);