brk/sbrk
從堆中分配空間,本質(zhì)是移動一個位置,向后移就是分配空間,向前移就是釋放空間
sbrk用相對的整數(shù)值確定位置,如果這個整數(shù)是正數(shù),會從當前位置向后移若干字節(jié),如果為負數(shù)就向前若干字節(jié)。在任何情況下,返回值永遠是移動之前的位置
brk用絕對的地址指定移到哪個位置。
#include <stdio.h>
#include <unistd.h>
int main()
{
void* p = sbrk(0);
int* p1 = p;
brk(p1+4);//分配了16個字節(jié)的空間
p1[0] = 10;
p1[1] = 20;
p1[2] = 30;
p1[3] = 40;
p1[4] = 50;
int* p2 = sbrk(4);
printf("*p2=%d\n", *p2);
brk(p1+1024);//分配整個頁面的空間
brk(p1+512);//釋放一半空間
brk(p1);//釋放所有空間
}
sbrk:
參數(shù)>0 向后移動當前位置,相當分配內(nèi)存空間
參數(shù)<0 向前移動當前位置,相當釋放內(nèi)存空間
參數(shù)==0 當前位置不動
返回總是移動前的位置
brk(void* ptr);
將當前位置移動到ptr的位置
ptr的位置一般通過sbrk(0)獲取首地址,然后再計算得出
sbrk實例
#include <stdio.h>
#include <unistd.h>
int main()
{
/*分配10個字節(jié)的空間,返回該空間的首地址*/
void* p = sbrk(12);
void* p2 = sbrk(4);
void* p3 = sbrk(4);
void* p4 = sbrk(4);
printf("p=%p\n", p);
printf("p2=%p\n", p2);
printf("p3=%p\n", p3);
printf("p4=%p\n", p4);
/*用參數(shù)為0來獲取未分配空間的開始位置*/
void* p0 = sbrk(0);
printf("p0=%p\n", p0);
void* p5 = sbrk(-4);
printf("p5=%p\n", p5);
printf("pid=%d\n", getpid());
sleep(10);
/*當釋放到一個頁面的開始位置時,整個頁面會被操作系統(tǒng)回收*/
sbrk(-20);
/*
int* pi = p;
*pi = 10;
*(pi+1) = 20;
*(pi+2) = 30;
*(pi+1023) = 1023;
*(pi+1024) = 1024;
*/
while(1);
}
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("pid=%d\n", getpid());
void* p = sbrk(0);
int* p1 = sbrk(4);
sleep(10);
int* p2 = sbrk(1023*4+1);
sleep(10);
sbrk(-1);
while(1);
}