sbrk/brk重新指定数据段的结束位置。sbrk(增量),增量可正可负,也可以是0,,都返回原来的数据段结束地址,失败返回-1,。brk(地址),返回0或者-1。头文件<unistd.h>。sbrk(0)可以取得当前结束地址。没有使用的虚拟内存地址,操作系统就没有映射到物理内存,如果试图访问会差生段错误。指定新的结束位置后如果有整个内存页被空闲出来,这一页就立即被解除映射。
<span style="font-size:18px;">#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
cout << "pagesize:" << getpagesize() << endl;
int *p = (int*)sbrk(0);
cout << p <<endl;
//int n = *p;//出现段错误
brk(p+8);//终点后移8*4个字节,操作系统把扩展的这段虚拟内存映射到物理内存,但映射以页为基本单位,实际映射的内存会是一页。
for(int i = 0; i < 1025; ++i)//这里小于等于1024的话都不会出现段错误
{
p[i] = i;
}
for(int i = 0; i < 1025; ++i)
{
cout << p[i] << " ";
}
cout << endl;
return 0;
}</span>
18个数的时候
1024个数的时候
1025个数的时候