【问题标题】:Dereferencing 'void *' pointer when using struct使用结构时取消引用'void *'指针
【发布时间】:2016-05-12 20:23:57
【问题描述】:

我正在尝试使用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 *'指针”

还有一个错误

“在非结构或联合的情况下请求成员‘name’”

在我做strncpy()的那一行。

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

【问题讨论】:

  • inode的定义是什么?
  • inode->i_private = info; 为什么要在kmallo() 之后赋值?你可能想要一个“深”副本(memcpy)
  • @MikeCAT, struct inode *

标签: c pointers struct void-pointers dereference


【解决方案1】:

首先,在你的代码中

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

【讨论】:

  • 使用局部指针变量会更易读:struct osffs_inode_private_info *pinfo = inode->i_private;strncpy(pinfo->name, "private succ", OSFFS_MAX_NAME_LEN);
  • @IanAbbott 对,你当然可以。我认为一旦我们在代码中更改为info = inode->i_private;,其余部分就很简单了。 :)
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2011-06-17
  • 2011-02-04
  • 2013-01-04
  • 2015-08-04
  • 1970-01-01
相关资源
最近更新 更多