sbrk/brk函数用法

头文件unistd.h

sbrk/brk函数重新指定数据段的结束位置,sbrk(0)获得当前数据段结束地址

sbrk(增量),增量可正,可负,可为0,都返回原来数据段的结束地址。失败返回-1

brk(地址),返回0或-1.

通过重新指定数据段新的结束位置,操作系统会以页为单位映射到物理内存或解除物理内存的映射。

具体用法看下面例子

#include <stdio.h>
#include <unistd.h>

int main()
{
	printf("page info size is %d\n", getpagesize());//获取页的大小
	int *p = sbrk(0); //获取当前数据段地址
	printf("end address is %p\n", p);
	brk(p+8); //数据段结束位置后移8*4个字节,实际映射了一页,即4096字节
	int i =0;
	for(; i < 18; i++) //数据越界不会出现段错误,因为是以页为单位4096个字节映射的
	{
		printf("%d ", p[i]);	
	}
	printf("\n");
	sbrk(4070); //数据段结束位置再后移4070个字节,(p = 32+ 4070 = 5002)此时内存映射了两页
	p[1024] = 100;
	printf("%d \n ", p[1024]);
	sbrk(-6);//数据段结束位置前移6个字节,即p向后移了4096字节,此时解除映射第二页
	printf("%d ", p[1024]); //此时出现段错误,因为 p[1024]超出第一页了。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值