繁体   English   中英

使用struct时取消引用'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定义如下:

struct osffs_inode_private_info {
    char name[OSFFS_MAX_NAME_LEN];
    __be64 block;
};

当我尝试编译时,我得到一个警告我

“取消引用'void *'指针”

和一个错误

“在非结构或联合中要求成员'名称'”

在执行strncpy()

我知道有很多关于取消引用空指针的线程/问题,似乎我只需要进行强制转换等即可。 但不幸的是,我不知道如何将其应用于我的问题。

首先,在您的代码中

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 *强制转换为所需的指针类型,以使其有资格用作成员访问运算符( -> )的左操作数。

您需要使用类似

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM