brk 和 sbrk()的使用 及分配内存方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了brk 和 sbrk()的使用 及分配内存方式相关的知识,希望对你有一定的参考价值。
- brk 和 sbrk的使用:
作用:malloc的底层实现,用于分配开辟内存,但是brk是系统调用 而sbrk不是 ,sbrk调用了brk
用法:
特别注意 : brk返回值 0成功 -1 失败
sbrk返回的是开辟之前的地址,错误返回-1
开辟后要brk(p)释放掉内存空间
简单示例:
1 1 #include <stdio.h> 2 2 #include <unistd.h> 3 3 #include <stdlib.h> 4 4 #include <string.h> 5 5 6 6 int main(int argc,char *argv[]) 7 7 { 8 8 void *p=sbrk(0); 9 9 void *str=sbrk(5); 10 10 brk(p+5); 11 11 // (*(char **)p)="adsf"; 12 12 // printf("%s",*((char**)p)); 13 13 strcpy((char*)str,"asdf"); 14 14 brk(p+9); 15 15 *((int *)(p+5))=123; 16 16 // printf(" %c\\n",*(char *)(p+3));//输出f 17 17 18 18 printf("%s\\n",(char *)(str)); 19 19 20 20 brk(p+5); 21 21 22 22 *(int *)(p+5)=123; 23 23 printf("%d\\n",*(int *)(p+5)); 24 24 25 25 brk(p); 26 26 return 0;
[[email protected] 01基础测试]# ./demo asdf 123
- sbrk在内存中开辟方式:
堆中的地址是由低地址往高地址存放的,通过下面的例子我们可以知道所谓的堆区和BSS段是人为区分的,其实它们是连在一起的,开辟空间不复制就是BSS段,复制后就是堆区
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <string.h> 5 6 int main(int argc,char *argv[]) 7 { 8 void *p=sbrk(0); 9 brk(p+5); 10 strcpy((char*)p,"asdf"); 11 12 13 printf(" %#x\\n",&*(char *)(p+3));//输出f的地址 14 printf(" %#x\\n",&*(char *)(p+2));//输出d的地址 15 void *q=sbrk(2); 16 void *m=sbrk(1); 17 void *n=sbrk(1); 18 printf(" %#x\\n",&*(char *)(q));//输出q的地址 19 20 printf(" %#x\\n",&*(char *)(m));//输出m的地址 21 printf(" %#x\\n",&*(char *)(n));//输出n的地址 22 printf("%s\\n",(char *)(p)); 23 24 25 brk(p); 26 return 0; 27 } ~
[[email protected] 01基础测试]# ./demo2 0xf1a003 0xf1a002 0xf1a005 0xf1a007 0xf1a008 asdf
以上是关于brk 和 sbrk()的使用 及分配内存方式的主要内容,如果未能解决你的问题,请参考以下文章
在malloc,为什么要使用brk?为什么不直接使用mmap?
Linux系统下深究一个malloc/brk/sbrk新内存后的page fault问题