2014-01-21 180 views
0

我目前正在編寫一個基於終端的十六進制編輯器。我有一些關於內存分配的問題。c內存分配和陣列陣列

跟蹤更改用戶已經做出我它們寫入像這樣數組的數組,該[i][0]是絕對從文件的開頭和[i][1]變化的偏移量的變化本身:

unsigned long long writebuffer[10000][2]; 

但我有2個問題。第一個陣列(writebuffer[i][0])需要爲sizeof unsigned long long,但第二個([i][1])可以小至sizeof unsigned char。是否有可能做這樣的事情?

也可以予動態分配writebuffer的第一索引所以像以上而更像我不會初始化:

unsigned long long **writebuffer; 

,然後變更與malloc()realloc()第一索引;而第二個索引將爲2,但大小爲unsigned char

+2

使用一個無符號長長一的一個結構無符號字符? – Nabla

+0

該死的很容易。是的,這工作 – RG337

回答

1

爲什麼不使用結構?

typedef struct { 
    long long offset; 
    int change; /* or unsigned short, or whatever you feel is right */ 
} t_change; 

注意,該結構將有可能獲得由編譯器填充到一個不同的大小,如果你選擇使用unsigned char的變化元件。填充的內容取決於您的編譯器,編譯器設置和目標體系結構。

+0

嗯爲什麼unsigned char得到填充?我的更改總是隻有1個字節長。所以這將是理想的,讓他們始終是字符的大小。 – RG337

+0

@ user3188237:該結構包含一個「long long offset」。在大多數C實現中,long long對象需要在內存中對齊到4個字節或更多倍的地址。如果結構的大小隻是'long long'的大小加上'unsigned char'的大小,那麼它就是9個字節。然後,該數組的結構將具有距數組起始處的偏移量爲0,9,18,27,36,...字節的元素。這會迫使一些'offset'成員不對齊。這是不允許的。因此,編譯器會填充該結構以使倍數對齊。 –

+0

我明白了。另一個小問題。如果我想realloc()一個由此構成的結構,我會用什麼?我想在添加更改之前執行此操作。 writebuffer = realloc的(writebuffer(++ wrcount)*的sizeof(???)); – RG337

0

可以定義類型空隙的數組:

void **writebuffer; 

,然後分配和使用的每個元素,只要你喜歡,例如:

*writebuffer[0] = (char*)malloc(sizeof(char));