使用结构时取消引用 'void *' 指针

Dereferencing 'void *' pointer when using struct

我正在尝试使用 inode 的 i_private 并在其中存储一个包含名称和块号的结构:

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() 的行中。

我知道有很多 threads/questions 关于取消引用 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,结构和联合成员

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);