- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个程序可以使用 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/
我们有一个GDBM键值数据库作为负载平衡的面向 Web 的应用程序的后端,该应用程序以 C++ 实现。应用程序提供的数据变得非常庞大,因此我们的管理员已将 GDBM 文件从“本地”存储(在网络服务器上
是否有任何特定函数或任何方式可以计算 GDBM 文件中的行数?否则,我想检索 GDBM 中的所有行> 一次文件(我能够使用 gdbm_fetch() 检索键值对,但一次只能检索一个。 最佳答案 我得到
我实现了以下 GBDM 示例: #include #include #include #include #include struct record { int a; int
GDBM看起来很有趣,一种持久性哈希或键值存储。但是示例代码没有运行: require 'gdbm' 导致此错误: cannot load such file -- gdbm (LoadError)
在 this book 中阅读有关 GDBM 的信息|他们只给出了可以存储的数据结构的简单示例。例如 $dbm{'key'} = "value"; 背景 我想在数据库中保存许多小文本文件,仅供本地使用
我正在尝试使用 C 语言学习 gnu gdbm 编程,但由于 gdbm 教程、书籍等的缺乏而无法继续。所以我唯一需要遵循的是 w3 上可用的几个简单的 gdbm c api 代码。我在两个单独的 .c
我有一个程序可以使用 GDBM 或 Kyoto Cabinet 作为 DBM 库。我已经编写了一些函数来抽象出两者之间的区别,并且我传递空指针来代替数据库文件(GDBM_FILE 对于 GDBM 和
我有一个 Python 程序,我试图在其中使用 this rhyming dictionary查找韵律。 部分字典库设置由 C 程序创建三个 gdbm .db 文件。执行此操作的代码是公开可用的 he
我正在研究基于文件的键值数据库,例如 GDBM,我看不出与使用配置文件相比有任何真正的优势。这两种技术都允许您将键和值存储在文件中。 GDBM 的性能优势,GDBM 是否更快地解析文件? 最佳答案 g
我在 anaconda 环境中使用 Python 3.6。我用 安装了 GDBM conda install gdbm 安装很顺利,但是我无法使用 Python 中的 dbm.gnu: ModuleN
我习惯了 macport,最近得到了一个新的 mac book pro 10.8.4,我切换了 brew 并尝试安装 python 但我收到以下错误: brew install python --un
嘿,在对我尝试使用的 bashrc 进行了一些更改之后 source ~/.bashrc 但出现如下错误 baaz@FireStorm:~$ source ~/.bashrc Traceback (m
按照 https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli
我是一名优秀的程序员,十分优秀!