gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:03:21 31 4
gpt4 key购买 nike

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

结构:

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

最佳答案

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

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

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

关于c - 为什么在另一个函数中 free()-ing 我的内存 malloc()-ed 会导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52679204/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com