簡體   English   中英

使用struct時取消引用'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定義如下:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM