#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).
Какой у вас вопрос? –