2013-04-16 2 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) место перерыва при заданном адресе addr и возвращении 0 в случае успеха -1 в противном случае. Глобальный символ errno указывает на характер ошибки. sbrk (2) переместить разрыв по данному приращению (в байтах). В зависимости от реализации системы он возвращает предыдущий или новый разрывный адрес. При ошибке он возвращает (void *) - 1 и устанавливает errno. В некоторой системе sbrk принимает отрицательные значения (чтобы освободить некоторую карту памяти.) Так как спецификация sbrk не фиксирует смысл ее результата, мы не будем использовать возвращаемое значение при перемещении разрыва. Но мы можем использовать частный случай sbrk: когда инкремент nul (т. Е. Sbrk (0)), возвращаемое значение является фактическим адресом разрыва (предыдущие и новые разрывы являются одинаковыми.) Таким образом, sbrk используется для извлечения начало кучи, которое является исходным положением разрыва. Итак, используя sbrk в качестве основного инструмента для реализации malloc.sbrk (0) и sbrk (размер) оба возвращают один и тот же адрес

sbrk (0), а также sbrk (размер) оба возвращают тот же адрес, что я ожидал, так это то, что sbrk (размер) должен вернуть адрес 5 байтов вперед от sbrk (0).

+0

Какой у вас вопрос? –

ответ

8

Когда вы используете sbrk(0), вы получаете текущий «перерыв».

Когда вы используете sbrk(size), вы получаете предыдущий «перерыв», то есть тот, который был до изменения.

Так что если вы вызываете его один раз с нулевым размером, а затем с положительным размером, то оба возвращают одинаковое значение. Если вы вызовете его снова с нулевым размером после звонок с положительным размером, он вернет новый адрес.

+0

Привет, Не могли бы вы объяснить, что является адресом перерыва? – user1079065

+0

@ user1079065 Я рекомендую вам ознакомиться с [статьей Википедии на 'sbrk'] (http://en.wikipedia.org/wiki/Sbrk), это объясняет это довольно хорошо. –

+0

Я читал то же самое на странице руководства, но в формулировке меня немного смутило: _ «При успехе sbrk() возвращает предыдущий разрыв программы. (Если разрыв был увеличен, то это значение является указателем на начало вновь выделенная память). »_ Начало новой выделенной памяти такое же, как и предыдущий адрес разрыва. –

Смежные вопросы