我试图利用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指针的线程/问题,看起来我只需要进行强制转换等等。但遗憾的是,我不知道如何将其应用于我的问题。
答案 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);