使用结构时取消引用 '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 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()
的行中。
我知道有很多 threads/questions 关于取消引用 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,结构和联合成员
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);
我正在尝试使用 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;
};
当我尝试编译时,我收到一条警告,提示我
"dereferencing a 'void *' pointer"
和错误
"request for member ‘name’ in something not a structure or union"
在我执行 strncpy()
的行中。
我知道有很多 threads/questions 关于取消引用 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,结构和联合成员
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);