brk 和 sbrk()的使用 及分配内存方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了brk 和 sbrk()的使用 及分配内存方式相关的知识,希望对你有一定的参考价值。

  1. 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

     


      
  2. 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()的使用 及分配内存方式的主要内容,如果未能解决你的问题,请参考以下文章

ptmalloc内存分配和回收详解(文字版)

菜鸟随笔---brk()与sbrk()函数的学习与使用

在malloc,为什么要使用brk?为什么不直接使用mmap?

Linux系统下深究一个malloc/brk/sbrk新内存后的page fault问题

调用 malloc 函数并不总是在内部调用 sbrk 函数?

brk 和 sbrk 区别