0

我正在使用 Tokyo Cabinet 来创建持久存储数据库。

我正在使用void *tcbdbget(TCBDB *bdb, const void *kbuf, int ksiz, int *sp); 它在 tcbdb.h 文件中给出段错误*sp = rec->vsiz;

东京内阁有错误还是我遗漏了什么?

因为插入记录工作正常,这意味着所有 void 指针都被完美地插入,只是查找有问题。插入功能是 this bool tcbdbput(TCBDB *bdb, const void *kbuf, int ksiz, const void *vbuf, int vsiz);

4

1 回答 1

0

它在 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.

于 2013-10-31T09:24:12.637 回答