取消引用' void *'使用struct时的指针

时间:2016-02-03 15:00:21

标签: c pointers struct void-pointers dereference

我试图利用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;
};

当我尝试编译时,我收到一条警告:

  

"取消引用' void *'指针"

和错误

  

"在非结构或联合的情况下请求成员'姓名'"

在我执行strncpy()的行中。

我知道有很多关于解除引用void指针的线程/问题,看起来我只需要进行强制转换等等。但遗憾的是,我不知道如何将其应用于我的问题。

1 个答案:

答案 0 :(得分:4)

首先,在你的代码中

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,结构和工会成员

  

->运算符的第一个操作数应具有指向原子,限定或类型的类型''   不合格的结构''或'指向原子,合格或不合格的联盟'',[...]

这就是为什么,你必须将void *强制转换为指向所需类型的指针,以使其有资格被用作成员访问运算符(->)的左操作数。 / p>

您需要使用类似

的内容
 strncpy( ((struct osffs_inode_private_info *)(inode->i_private))->name, 
           "private succ", 
            OSFFS_MAX_NAME_LEN);