2014-03-30 61 views
1

如果我有* p = malloc(1000),我想將內存p劃分爲200和300的塊,並獲取塊的地址並使用它。有沒有簡單的方法來做到這一點?如何將malloc內存劃分爲c

+6

是;只需添加200個字節到你的指針。這是你的記憶;你可以隨心所欲地做任何事情。 – SLaks

+2

只有當你總是希望再次釋放它們時纔有意義,在這種情況下,這是一種有效的優化。如果你想建立你自己的分配器,你通常會去內存塊的低級平臺方法... – Deduplicator

+0

這可能是一個非常糟糕的主意。你至少應該考慮到任何對齊問題。 –

回答

4

有沒有你不這樣做的理由......

char* firstblock = malloc(200); char* secondblock = malloc(300); char* thirdblock = malloc(500);

如果你想帶你雖然方法,你可以做

char* wholething = malloc(1000); char* firstblock = wholething; char* secondblock = wholething + 200; char* thirdblock = wholething + (200 + 300);

但對我來說沒有多大意義。

我推薦使用獨立塊的第一個原因是因爲當你完成它時你可以釋放一個塊。如果你無論如何都在同一時間釋放所有這些,那麼這是真的,它可以稍微提高性能,但是這種好處可以忽略不計。第二個原因是你的系統可能比一個小塊更快樂,因爲一個大塊不適合頁面。儘管可以說相反,因爲需要追蹤更少的街區。但是,再一次,在大多數情況下,性能優勢或影響非常小,以至於您採用哪種方法確實無關緊要。所以第三個原因,可讀性,就是爲什麼我說要使用單個塊。


請記住,偏移量可能需要或可能不需要乘以大小。

在這種情況下,是的......

char* wholething = malloc(1000 * sizeof(int)); int* firstblock = wholething; int* secondblock = wholething + 200; int* thirdblock = wholething + (200 + 300);

但是在這種情況下,不...

int* wholething = malloc(1000 * sizeof(int)); int* firstblock = wholething; int* secondblock = wholething + 200; int* thirdblock = wholething + (200 + 300);

1

malloc是肯定給你一個連續的塊。您可以像通過數組一樣遍歷塊。分成塊只是索引到正確的位置。

char *p; 
p = malloc(sizeof(char)*10+sizeof(int)*20); 
char *x = p; 
int *y = p+10; 

現在x[0]x[9]可用於char S和y[0]y[19]可用於int小號

這是一個非常愚蠢的辦法。更好的方法是簡單地使用單獨的塊。

+0

任何使用'sizeof(char)'的人都不理解他寫的東西。你怎麼問:「有多少隻大象是一隻大象?」 – Deduplicator

+2

爲了便於閱讀,我使用'sizeof(char)'。我**知道'sizeof(char)'肯定是1個字節(儘管不一定是8位)。當我使用'sizeof(char)'時,我發現我的代碼更具可讀性。這對我的時間並不是很大的浪費 – avmohan

+1

我覺得另一種有助於理解的方法是char * x; int * y; char * p = malloc(sizeof(* x)* 10 + sizeof(* y)* 20); x = p; y =(int *)(p + 10);'。使用'sizeof(* pointer_variable)'。 – chux