2015-01-11 82 views
1

我對C真的很陌生...... 我想要的邏輯磁盤(讓我們稱爲logdisk)必須有64個塊,每個塊是64個字節。使用char數組實現64塊邏輯磁盤c

例如, logdisk [i] [j],i是logdisk上邏輯塊的數量或索引,j是塊長度(以字節爲單位)。

所以,

logdisk [5] [0]應該給我塊5

的第一個字節,但我有創造這個logdisk的麻煩,因爲我不知道如何分配使用malloc的2d char數組,我有下面的代碼。

char *logdisk = malloc(64 * 64);  

有人可以告訴我如何創建一個64位64字節塊的2d字符數組?

感謝評論,現在我得到一些線索,

char (*logdisk)[64] = malloc(64*64); 

上面的一個是從賈森,而下面一個是我的想法,其中一個我應該使用64 * 64的邏輯磁盤?

char **logdisk = malloc(sizeof(char)*64); 
for (int i = 0; i < 64; i++) { 
    logdisk[i] = malloc(sizeof(char)*64); 
} 
+0

我很困惑你想在這裏實現什麼。你在談論邏輯磁盤 - 很好,然後做'char * logdisk = start_of_disk;'。你爲什麼試圖分配一個指向更多數組的指針來按照定義描述線性的東西? – Blindy

回答

1

你可以聲明char **舉行二維數組:

char **logdisk = malloc(64 * sizeof(char *)); // allocate block pointers 
int i; 

for (i = 0; i < 64; ++i) { // allocate each block 
    logdisk[i] = malloc(64 * sizeof(char)); 
} 

取消分配去以同樣的方式,但在相反的。

+0

是的:)這就是我想的!但我只需要64 * 64字節,sizeof(char)* 64 * 64會給我一個不同的內存? – Noah

+0

,你能告訴我更多關於釋放的信息嗎?你的意思是相同的,但相反? – Noah

+0

@Noah'64 * sizeof(char *)'用於分配64個指針的數組,注意'char'後面的'*',那麼這次循環會分配每個扇區'64 * sizeof(char)', '64' – Jasen

1

你正在尋找 要麼

malloc(sizeof(char) * 64 * 64) 

當盤Y的字節x由

logdisk[y*64+x]; 

char **logdisk = malloc(sizeof(char*) * 64); 
for(int i = 0; i < 64; ++i) 
    logdisk[i] = malloc(sizeof(char) * 64); 

訪問磁盤的Y字節X的訪問通過

logdisk[Y][X]; 
+0

是的:)這就是我想的!但我只需要64 * 64字節,sizeof(char)* 64 * 64會給我一個不同的內存? – Noah

+0

不,但最好在分配中使用'sizeof'以確保跨平臺的正確內存大小。 –

2
unsigned char (*logdisk)[64] = malloc(64*64); 

我使用了無符號字符,因爲字符可以是有符號或無符號的,這取決於你使用的編譯器和大多數人認爲字節是無符號的。

此logdisk定義爲一個指針指向一個塊(這是64無符號字符的陣列),

那麼可以說logdisk [5] [7]和具有塊5等第七字節..

+0

unsigned char ** logdisk [64] = malloc(sizeof(char)* 64); – Noah

+0

sizeof(char *)怎麼樣?我需要與否? – Noah

+0

@Noah,首先看起來像一個語法錯誤,我'你把logdisk聲明爲指向無符號字符的指針的數組64',然後嘗試用標量初始化數組。 'sizeof(char)'從不需要,它總是1。 – Jasen

0
I would do it this way: 

#define MAX_DISK_BLOCK_LEN (64) 
#define MAX_DISK_BLOCKS (64) 

struct diskBlock 
{ 
    char diskBlock[MAX_DISK_BLOCK_LEN]; 
}; 


struct diskBlock * logDisk = malloc(MAX_DISK_BLOCKS*sizeof(struct diskBlock)); 

if(NULL == logDisk) 
{ 
    perror("malloc for logDisk failed"); 
    exit(EXIT_FAILURE _; 
} 

// implied else, malloc successful 

logDisk[x].diskBlock[y] to access the areas in this logDisk 
         remembering to keep 'x' to the range 0...(MAX_DISK_BLOCKS-1) 
         remembering to keep 'y' to the range 0...(MAX_DISK_BLOCK_LEN -1)