[英]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定义如下:
struct osffs_inode_private_info {
char name[OSFFS_MAX_NAME_LEN];
__be64 block;
};
当我尝试编译时,我得到一个警告我
“取消引用'void *'指针”
和一个错误
“在非结构或联合中要求成员'名称'”
在执行strncpy()
。
我知道有很多关于取消引用空指针的线程/问题,似乎我只需要进行强制转换等即可。 但不幸的是,我不知道如何将其应用于我的问题。
首先,在您的代码中
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.