它在 tcbdb.h 文件中给出了段错误*sp = rec->vsiz;
Tokyo Cabinet (aka TC) 希望您在调用时传递一个有效的非 NULL 指针来存储值的大小tcbdbget
,例如:
int size;
char *buf = tcbdbget(bdb, kbuf, ksiz, &size);
传递一个 NULL 指针可以解释这个精确代码部分的段错误。请在下面找到一个示例代码,您可以使用它BUG = 1
来生成一个段错误 -BUG = 0
一切都像一个魅力:)
#include <stdio.h>
#include <string.h>
#include <tcbdb.h>
#define BUG 0
int
main(void)
{
TCBDB *bdb = tcbdbnew();
if (!tcbdbopen(bdb, "store.db", BDBOWRITER | BDBOCREAT)) {
fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
}
char *key = "foo";
char *val = "bar";
if (!tcbdbput(bdb, key, strlen(key), val, strlen(val))) {
fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
}
int size;
#if BUG
char *buf = tcbdbget(bdb, key, strlen(key), NULL);
#else
char *buf = tcbdbget(bdb, key, strlen(key), &size);
#endif
if (!buf && tcbdbecode(bdb) != TCENOREC) {
fprintf(stderr, "error: %s\n", tcbdberrmsg(tcbdbecode(bdb)));
}
if (buf)
printf("%s -> %s\n", key, buf);
free(buf);
tcbdbdel(bdb);
return 0;
}
注意:因为 TC 总是附加一个尾随 terminator \0
,并且因为我知道我已经存储了一个字符串,所以我可以安全地printf
buf
使用%s
.