Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取DBCursor->;获取(…)以识别我为key.data和data.data分配的内存_C_Berkeley Db - Fatal编程技术网

如何获取DBCursor->;获取(…)以识别我为key.data和data.data分配的内存

如何获取DBCursor->;获取(…)以识别我为key.data和data.data分配的内存,c,berkeley-db,C,Berkeley Db,我正在开发一个C程序,从BerkeleyDB数据库中提取数据值与特定模式匹配的记录。我创建数据库,打开它,将一个DBT归零为key,另一个归零为data,将DBT标志设置为DB_DBT_USERMEM,将DBT的数据成员设置为malloc large buffers,将DBT ulen slot设置为分配的缓冲区的大小,获取一个游标,然后转到这一行 ret=cursor->get(光标、键和数据、DB\u NEXT) 尽管malloced缓冲区是2056个字符,key.data的大小是25,da

我正在开发一个C程序,从BerkeleyDB数据库中提取数据值与特定模式匹配的记录。我创建数据库,打开它,将一个DBT归零为key,另一个归零为data,将DBT标志设置为DB_DBT_USERMEM,将DBT的数据成员设置为malloc large buffers,将DBT ulen slot设置为分配的缓冲区的大小,获取一个游标,然后转到这一行

ret=cursor->get(光标、键和数据、DB\u NEXT)

尽管malloced缓冲区是2056个字符,key.data的大小是25,data.data的大小是75,但ret总是DB_BUFFER_小


我做错了什么?

谢谢你的提问。这让我找到了解决办法,那就是

/* Initialize key/data structures. */
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));

key.flags = DB_DBT_USERMEM;
data.flags = DB_DBT_USERMEM;

key.data = (char *)malloc(dataSize);
key.ulen = dataSize;
data.data = (char *)malloc(dataSize);
data.ulen = dataSize;

memset(key.data, 0, sizeof(key.data));
memset(data.data, 0, sizeof(data.data));
而不是

/* Initialize key/data structures. */
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));

key.flags = DB_DBT_USERMEM;
data.flags = DB_DBT_USERMEM;

key.data = (char *)malloc(dataSize);
key.ulen = dataSize;
data.data = (char *)malloc(dataSize);
data.ulen = dataSize;

memset(&(key.data), 0, sizeof(key.data));
memset(&(data.data), 0, sizeof(data.data));
我将一个指向char*指针的指针传递给memset,而不是传递指针本身。你的问题让我对初始化代码产生了疑问


谢谢

我将malloced内存缓冲区分配给DBT数据成员,如下'key.data=(char*)malloc(dataSize);key.ulen=dataSize;'听起来你做得对。USERMEM标志是最容易出错的地方。你能发布你用来初始化密钥和数据的确切代码吗?太好了!由于您的描述听起来是正确的,所以它必须是关于实现的特定内容。