[英]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.