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

标签 c pointers struct void-pointers dereference

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

相关文章:

c - 顺序逐字节比较

c++ - 生命游戏,C++ - 多态数组(也许还有指针)

c - 使用 pthread_create 时结构会丢失对变量的跟踪

objective-c - 在 Objective-C 中转发声明一个结构

c - ascii字符限制是255?

c - 检测静态库是否为瘦存档

c - 我需要从驱动器读取原始数据并将数据写入驱动器..help

c - 在双向链表中正确分配结构指针

C++ 数组和指针

swift - 通过相同的结构从不同的 API 获取数据?