2013-04-16 65 views
2
#include<unistd.h> 
#include<stdio.h> 

void *my_malloc(size_t size){ 
void *p; 
void *q; 
p = sbrk(0); 
/* If sbrk fails, we return NULL */ 
q = sbrk(size); 
if(q == (void *)-1){ 
    return NULL; 
} 
printf("\n size : %d p : 0x%x q : 0x%x \n",size,p,q); 
return p; 
} 
int main(){ 
int *p; 
p = my_malloc(5); 
printf("\n p : 0x%x \n",p); 
} 

BRK(2)將突破在給定ADRESS地址,如果成功,否則爲-1返回0。全局的errno符號表示錯誤的性質。 sbrk(2)按給定的增量移動中斷(以字節爲單位)。根據系統實現情況,它返回前一個或新中斷地址。失敗時,它返回(void *) - 1並設置errno。在某些系統上,sbrk接受負值(爲了釋放一些映射的內存)。 由於sbrk的規範沒有解決其結果的含義,因此移動中斷時不會使用返回的值。但是,我們可以使用sbrk的一個特例:當增量爲nul(即sbrk(0))時,返回的值是實際的中斷地址(前一個和新中斷地址相同)。sbrk因此用於檢索堆的開始是休息的初始位置。 所以使用sbrk作爲主要工具來實現malloc。 sbrk(0)和sbrk(size)都返回相同的地址,我期望的是sbrk(size)應該從sbrk(0)前面返回5個字節的地址。SBRK(0)和SBRK(大小)都返回相同的地址

+0

你的實際問題是什麼? –

回答

8

當您使用sbrk(0)時,您將獲得當前的「break」地址。

當您使用sbrk(size)時,您將獲得之前的「中斷」地址,即更改前的地址。

因此,如果您調用一次大小爲零的零後跟一個正值大小的調用,那麼兩者都會返回相同的值。如果您在之後撥打之後再撥打一個零大小的號碼,則會返回新的地址。

+0

嗨, 你能解釋一下什麼是休息地址? – user1079065

+0

@ user1079065我建議你閱讀[sbrk'上的維基百科文章](http://en.wikipedia.org/wiki/Sbrk),它解釋得很好。 –

+0

我在手冊頁中讀到相同的內容,但措辭讓我感到困惑:_「成功時,sbrk()返回前一個程序中斷(如果中斷增加,則此值是指向開始的指針新分配的內存)。「_新分配的內存的開始與前一箇中斷地址相同。 –