我正在尝试使用hiredis将一个结构SET到Redis中:
struct StatLite
{
uid_t uid;
gid_t gid;
mode_t mode;
}
bool RedisPermissionHandler::Set(std::string path, StatLite stat)
{
redisReply *reply = (redisReply*)redisCommand(this->redis,
"SET %b %b",
path.c_str(), (size_t)path.length(),
stat, (size_t)sizeof(stat));
freeReplyObject(reply);
return true;
}然而,这在hiredis内部的某个地方遇到了分段故障。
this->redis、path和stat具有正确的值。GET命令工作并提供NIL回复类型(因为Redis是空的)。
我做错了什么?
发布于 2019-11-04 10:36:58
这里的问题是您指定的是一个原始结构,而不是指向该结构的指针:
bool RedisPermissionHandler::Set(std::string path, StatLite stat)
{
redisReply *reply = (redisReply*)redisCommand(this->redis,
"SET %b %b",
path.c_str(), (size_t)path.length(),
&stat, (size_t)sizeof(stat) // Pointer to stat!
);
freeReplyObject(reply);
return true;
}很可能驱动程序正在寻找特定大小的void*缓冲区,并将stat视为void*,从而在该指针被取消引用时导致段错误。
https://stackoverflow.com/questions/58686351
复制相似问题