2012-01-08 63 views
1

你有一個操作系統,它有2個功能處理內存分配的:鑄造地址

void *malloc(int sz) // allocates a memory block sz bytes long 

void free(void *addr) // frees a memory block starting at addr 
         // (previously allocated by malloc) 

使用這些功能,實現以下兩個功能:

void *malloc_aligned(int sz) // allocates a memory block sz bytes long, 
           // aligned to an address divisible by 16 

void free_aligned(void *addr) // frees a memory block starting at addr 
           // (previously allocated by malloc_aligned) 

在溶液中有是以下部分:

void * aligned_malloc(size_t size){ 
    unsigned char *res=malloc(size+16); 
    unsigned char offest=16-((long)res%16); 

我不明白的是:爲什麼我們需要使用無符號char以及爲什麼和我們使用16-((long)res%16);實現了什麼以及在這種情況下(long)res的用途是什麼?

+0

這是Jango的已知問題嗎? – 2012-01-08 12:12:59

+1

是的,這是來自jungo的問題 – mary 2012-01-08 12:20:22

+0

A.祝你好運(B:下面的答案是好的 – 2012-01-08 12:33:35

回答

3

你不能在「void *」上做指針運算,因爲void沒有大小。
添加到指針或減去指針時,總是以sizeof(*p)爲單位完成。含義 - 如果將一個指針添加到一個int指針,其值將增加4(因爲整數的大小爲4)。所以當你添加一個void指針時,它應該增加一個void的大小。但是虛空沒有大小。

但是,有些編譯器願意在void *上做算術運算,他們會像char *那樣對待它。藉助這些編譯器,您可以在不投射的情況下實現這些功能。但這不是標準。

另一點是並非所有的操作符都適用於指針。加法和減法是,但乘法,除法和模量不是。所以,如果你想測試一個指針的低位,要知道它是否對齊,你就把它投入很長時間。
爲什麼長?假設是long與指針一樣大,這在Linux中是正確的,但在Windows中不是這樣。正確的類型是uintptr_t。但是,如果您只對低位感興趣,則在投射時丟失高位並不重要。所以對int的強制轉換也會起作用。

+0

好吧,這解釋了unsigned char但我怎麼解釋長(res)? – mary 2012-01-08 12:43:43

+0

的確,我只回答了一半的問題。編輯我的答案,添加其餘的。 – ugoren 2012-01-08 15:59:59

+0

我不明白的幾件事是:a。測試指針的低位是什麼意思。灣這意味着比特是什麼意思? – mary 2012-01-09 15:03:15