C语言 为什么在另一个函数中 free()-ing 我的内存 malloc()-ed 会导致崩溃?



我有一个结构和函数的链接列表,可以从中添加、删除和创建数据。现在,当我尝试释放我在创建函数中分配的((数据时,问题就出现了。如果我删除释放内存的代码部分,但随后我不释放内存,则程序运行良好。

结构:

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 leftn");
}
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));

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

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

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

strcpy(newInfo->brand, brand);

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

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

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));

总之,这里有很多很多错误,这就是为什么你发现它如此令人沮丧。重读有关指针和动态分配的信息,并根据所学内容再次查看代码。

查看sizeof()运算符的返回值。我想你会发现你分配了足够的字节来存储指针,而不是结构或字符本身。sizeof()这样很棘手。

malloc()实现可能会为内部管理分配一些额外的字节。如果你分配的内存太少,并开始写入这些内部结构,你就完全进入了未定义的行为领域,当你尝试free()该块时,这会显示出来,因为free()可能想要使用该数据。

编辑:请参阅下面的讨论,了解我推迟的保龄球@David惯用解决方案和讨论:carinfo_t *newInfo = malloc (sizeof *newInfo);

最新更新