2016-02-03 103 views
0

當我試圖利用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; 
}; 

當我嘗試編譯,我得到一個警告,我

「解引用 'void *的' 指針」

和錯誤

「的東西請求成員的名字'不是一個結構或聯合」

在我做 strncpy()

我知道有很多關於解除引用void指針的線程/問題,而且好像我只需要執行一次cast或類似的操作。但不幸的是,我不知道如何將其應用於我的問題。

+0

什麼是'inode'的定義是什麼? – MikeCAT

+0

'inode-> i_private = info;'你爲什麼在kmallo()之後賦值?你可能需要一個「深層」的拷貝(memcpy) – wildplasser

+0

@MikeCAT,['struct inode *'](http://lxr.free-electrons.com/source/include/linux/fs.h) – ikegami

回答

4

首先,在你的代碼

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); 
+1

這將是儘管使用本地指針變量更具可讀性:'struct osffs_inode_private_info * pinfo = inode-> i_private;''和'strncpy(pinfo-> name,「private succ」,OSFFS_MAX_NAME_LEN);'。 –

+0

@IanAbbott對,你當然可以。我想一旦我們在代碼中更改爲'info = inode-> i_private;',rest部分就非常直。 :) –