2014-12-03 16 views
2

我對C/C++非常陌生,所以我知道這個問題可能是微不足道的,但我不知道如何繼續。我已分配的各自512個字節,像這樣的存儲器塊(扇區是大小的一個結構512個字節): char* block = (char *) malloc (sizeof(Sector));聲明多個結構並將它們覆蓋在已分配的內存上

我有另一個結構是128個字節大小:

typedef struct inode { 
int fileSize; 
int fileType; 
int* blockPointer[30]; 
} inodeFile; 

我想要做的是將這個結構覆蓋在塊上。我需要每個塊包含4個inode結構,但每個結構可能沒有任何與之關聯的值,直到稍後在程序中。因此,例如:

((*inodeFile) block)->fileSize = 10;

如果我理解正確,這是設置在第一個4個字節的指針塊檔案大小的。我會繼續爲結構的每個字段執行此操作。

我的問題是,我該如何做4個不同的inode?由於有4個不同的inode,我怎樣才能返回不同結構的每個字段的值?這似乎只是說block-> fileSize不起作用,因爲最多可以有四種不同的文件大小。

+0

爲什麼不'(((* inodeFile)塊)+1) - >檔案大小= 10;'(除了對嚴格別名問題,該方案不可避免地跑起來) – IdeaHat 2014-12-03 18:36:12

+0

你有沒有考慮'的typedef的優點聯合InodeSector {扇區扇區; inodeFile inodes [4]; } InodeSector;'(你的首選一致大小寫/駱駝大小寫/下劃線命名方案)?在我看來,'Sector'和'inodeFile'不一致,但一致性是有益的。使用'union',您可以將數據作爲扇區或具有4個'inodeFile'條目的數組訪問。您可能仍需要注意嚴格的別名。 – 2014-12-03 18:53:05

+1

嘗試'((inodeFile *)block)[0] .fileSize = 10;'(在類型名稱的另一側使用'[]'取消引用,以便您可以輕鬆訪問第二,第三和第四個將索引更改爲1,2或3)。 – Dmitri 2014-12-03 18:54:30

回答

0

您可以使用union覆蓋扇區上的塊。因爲這些字段是int類型或指針或512的大小,只要自然大小爲32位,就不應該存在對齊問題。

typedef struct { 
    int fileSize; 
    int fileType; 
    int* blockPointer[30]; 
} inode; 

typedef union { 
    unsigned char bytes[512]; 
    inode block[4]; 
} sector; 

int main() 
{ 
    sector thisec; 
    thisec.bytes[511] = 0; 
    thisec.block[0].fileSize = 10; 
    return 0; 
} 
+0

thisec.bytes [511] = 0;是多餘的。也許,你想說,memset(&thissect,0,sizeof thissect); ? – 2014-12-03 19:01:20

+0

這是一個例子,我將把'fread()',但我不知道OP從哪裏獲取塊數據。 – 2014-12-03 19:02:01

+0

無論如何,這不是'thissect',而是'thisec'。我寫了索引511來顯示編譯工作,但我不想幹涉'fileSize'字段。 – 2014-12-03 19:07:58