gpt4 book ai didi

c - C 中的 Malloc 问题

转载 作者:太空宇宙 更新时间:2023-11-04 05:45:55 25 4
gpt4 key购买 nike

解决方案:分配的内存在程序退出后被释放。必须从磁盘读+写回链表,然后重写以更新数据库!谢谢大家 =)

你好,过去几个晚上我基本上一直在研究这个数据库程序,但我不断地陷入死胡同。作业今天到期,所以如果你能帮助我,我将不胜感激。 =T

数据库是用链表实现的,由几个文件组成:sdbm.c、sdbm.h、new.c、get.c、insert.c、put.c和remove.c。 sdbm.c 保存了基于 sdbm.h 接口(interface)的数据库方法,其他文件包含使用 sdbm 方法的主要方法。

第一个问题来自插入程序,当我尝试添加键值对时它似乎工作正常……也就是说,直到我们再次尝试调用插入程序。分配的内存好像消失了!我一直在研究,试图找出为什么即使我已经 malloced,为什么它会在插入程序退出后消失。这是一些代码:

  • The node structure + global variable:
struct dbase_Node {
char *keyValue;
char *element;
struct dbase_Node *next;
};

typedef struct dbase_Node Node;

Node *head;

========

  • The insert method
static bool sdbm_insert_back(Node **headRef, const char *key, const char *value)
{
Node *new = (Node *)malloc(sizeof(Node));
if (new == NULL)
return false;
else {
new->keyValue = malloc(strlen(key));
new->element = malloc(strlen(value));
strcpy(new->keyValue, key);
strcpy(new->element, value);

new->next = *headRef;
*headRef = new;
return true;
}
}
  • The sync method
bool sdbm_sync()
{
if (!isOpen()) { return false; }

if (fopen(databaseName, "w" ) == NULL) {
error = SDBM_FOPEN_FAILED;
return false;
}

Node *current = head;

while (current != NULL) {
fprintf(database, "Key: %s\n", current->keyValue);
fprintf(database, "Value: %s\n", current->element);
current = current->next;
}
return true;
}

我运行以下命令:

./new [数据库] <-- 工作正常./insert [database] [key] [value] <--似乎工作正常

然后在我尝试插入更多之后,已经添加的节点消失了......

最佳答案

new->keyValue = malloc(strlen(key));
new->element = malloc(strlen(value));
strcpy(new->keyValue, key);
strcpy(new->element, value);

这会导致差一缓冲区溢出。您需要为终止 \0 分配空间, 所以使用 strlen(key) + 1strlen(value) + 1 .

或者更好的是,使用 strdup() :

new->keyValue = strdup(key);
new->element = strdup(value);

程序存在后数据丢失的问题非常简单,但解决起来并不容易:您没有将数据存储在内存中,而是存储在内存中。当程序退出时,内存会自动释放。所以你必须存储它,例如在文件中。

关于c - C 中的 Malloc 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5191574/

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