2016-12-05 37 views
-2

我正在研究旨在爲類創建文件系統的簡單版本的項目。當我使用我們定義的「inode」結構時,我遇到了麻煩。 inode的結構定義如下:將緩衝區寫入結構似乎不起作用

struct iNode 
{ 
    char name[8]; //file name 
    int size;  // file size 
    int blockPointers[8]; // direct block pointers 
    int used;    // 0 if free; 1 if in use 
}; 

我也有下面的代碼後來在我的項目:

char* inodes = NULL; 
inodes = new char[48]; 
iNode *myinode = new iNode(); 
int inodemax = 16; 
int storedi = 0; 
int x = 0; 
while(x < inodemax){ 
    disk.seekg(128 + 48*x,ios::beg); 
    disk.read(inodes, 48); 
    inodex = (struct iNode *) &inodes; 
    if(inodex -> used == 0){ 
    inodex -> used = 1; 
    for(int i = 0; i < 8; i++){ 
     inodex -> name[i] = name[i]; 
    } 
    inodex -> size = size; 
    storedi = disk.tellg(); 
    break; 
    } 
    if(inodex -> used != 0 && x == 15){ 
    return 4; 
    } 
    x = x +1; 
} 

我不能很好地在C精通++所以任何明顯的錯誤可能會犧牲我在語言方面的有限知識(我對C有更好的體驗)。我的問題伴隨着這樣一個事實,即我創建了一個測試用例,其中inodes used字段應該爲0,但返回「4」的返回語句。它不應該達到這部分代碼。

當我手動更改我的代碼以從inode緩衝區獲取「used」字段時,它可以正常工作。所以我導致我相信我在將我的char *緩衝區複製到我的結構中時出錯。

任何人都可以指出我在做什麼錯了,我該如何解決它?我一直堅持這一段時間,謝謝。

+0

請給出[MCVE。沒有這些,我們就沒有完整的背景,也不能合理地期望調試問題。 – kaylum

+0

你不應該使用'48'的魔法值;改爲使用'sizeof(iNode)'。 –

+0

@kaylum這是我目前面臨困難的唯一部分。缺少什麼「背景」? –

回答

1
inodes = new char[48]; 

inodes是指向48字節緩衝區的指針。

inodex = (struct iNode *) &inodes; 

這設置inodex指向inodes指針。不是什麼inodes指向,而是指針本身。

這是相當明顯的,這確實應該:

inodex = (struct iNode *) inodes; 

,或者更明確的:

inodex = reinterpret_cast<struct iNode *>(inodes); 
+0

當然,將一個任意字節數組轉換爲一個'struct'就是一個雷區,如果任何繼承等等都會發揮作用,那麼雷區就會出錯! –

+0

你修正的代碼行實際上是直接來自我複製粘貼的教師(我擔心我自己添加的行是錯誤的)。 感謝您的幫助。 –