我正在尝试使用 inode的 i_private 并在其中存储一个带有名称和 block 号的结构:
struct osffs_inode_private_info* info;
inode->i_private = kzalloc(sizeof(struct osffs_inode_private_info), GFP_KERNEL);
inode->i_private = info;
strncpy(inode->i_private->name, "private succ", OSFFS_MAX_NAME_LEN);
结构定义如下:
struct osffs_inode_private_info {
char name[OSFFS_MAX_NAME_LEN];
__be64 block;
};
当我尝试编译时,我得到一个警告,我是
"dereferencing a 'void *' pointer"
还有一个错误
"request for member ‘name’ in something not a structure or union"
在我执行 strncpy()
的行中。
我知道有很多关于取消引用 void 指针的线程/问题,看来我只需要进行强制转换或类似操作。但不幸的是,我不知道如何将其应用于我的问题。
最佳答案
首先,在你的代码中
inode->i_private = kzalloc(sizeof(struct osffs_inode_private_info), GFP_KERNEL);
inode->i_private = info;
你正在泄漏内存。在后面的语句中,您通过将 分配给 来覆盖 inode->i_private
中的先前指针。
也许你想做
info = inode->i_private;
就是说,问题中的问题是 i_private
的上述用法。这是一个 void
指针,不能取消引用。
引用 C11
,章节 §6.5.2.3,结构和 union 成员
The first operand of the
->
operator shall have type ‘‘pointer to atomic, qualified, or unqualified structure’’ or ‘‘pointer to atomic, qualified, or unqualified union’’,[...]
这就是为什么您必须将 void *
转换为指向所需类型的指针,以使其有资格用作成员访问运算符的左操作数(->
).
你需要使用类似的东西
strncpy( ((struct osffs_inode_private_info *)(inode->i_private))->name,
"private succ",
OSFFS_MAX_NAME_LEN);
关于c - 使用结构时取消引用 'void *' 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35180437/