gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:56 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com