gpt4 book ai didi

c - 通过 void 指针传递的 GDBM 对象丢失/损坏

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

我有一个程序可以使用 GDBM 或 Kyoto Cabinet 作为 DBM 库。我已经编写了一些函数来抽象出两者之间的区别,并且我传递空指针来代替数据库文件(GDBM_FILE 对于 GDBM 和 KCDB *在京都内阁的情况下)。 KC 的一切工作正常,但是当我尝试使用 GDBM 后端时,数据库在将它传递给不同的函数时以某种方式“丢失”。当我尝试转换指针并取消引用它,然后将其传递给 GDBM 函数之一时,它会出现段错误,并且在调试器中它会提示 db 文件不存在。

下面是一些可以重现问题的代码:

#include <gdbm.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>

void *
dbopen (void)
{
printf ("opening\n");
GDBM_FILE database = gdbm_open ("test.db", 512, GDBM_WRCREAT,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, NULL);
if (!database)
{
printf ("cannot open database\n");
return NULL;
}
void *db = &database;
return db;
}

void
dbclose (void *db, void *foo)
{
printf ("%d\n", *(int *)foo);
GDBM_FILE database = *(GDBM_FILE *)db;
if (!database)
{
printf ("database lost\n");
return;
}
printf ("closing\n");
gdbm_close (database);
return;
}

void
fun (void *db, void *foo)
{
GDBM_FILE database = *(GDBM_FILE *)db;
datum key, value;
int bar = *(int *)foo; /* and yet, if I remove this line and the next */
printf ("%d\n", bar); /* one, it works! */
printf ("%d\n", *(int *)foo);
if (!database)
printf ("no db?\n");
key.dptr = "baz";
key.dsize = 4;
value.dptr = "quux";
value.dsize = 4;
printf ("storing\n");
gdbm_store (database, key, value, GDBM_REPLACE);
printf ("all done\n");
return;
}

int
main (void)
{
int foo = 5;
void *dbp = dbopen ();
void *foop = &foo;
fun (dbp, foop);
dbclose (dbp, foop);
}

当我运行该代码时,它在调用 gdbm_close() 时出现段错误并出现“找不到文件”错误。正如评论所指出的,如果我没有明确地将另一个 void 指针存储到一个 int,那么程序运行得很好。

在我的实际程序中,当我调用 gdbm_store() 时它“丢失”了,它是我使用的唯一空指针(在这个测试程序中,foo 指针应该只是一个完整性检查)。

我确信在 C 语言的内存分配中有一些我忘记或不理解的东西。为什么引用 int 的 void 指针没有丢失/损坏引用 GDBM 数据库的 void 指针?为什么,当我不尝试将取消引用的 void 指针 foo 存储到一个 int 时,它会突然起作用吗?

最佳答案

您的问题是获取从 gdbm_open 返回的指针的地址而不是它的值。令人困惑的部分来自 GDBM_FILE 的定义——它是一个指向结构的指针:

typedef struct {int dummy[10];} *GDBM_FILE;

你得到它的地址,也就是指针的位置,而不是指针值:

void *db = &database;

可以通过将转换行替换为以下内容来解决问题:

void *db = (void *)database;

GDBM_FILE database = (GDBM_FILE)db;

关于c - 通过 void 指针传递的 GDBM 对象丢失/损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17395358/

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