码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-07-05 14:22:23      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:int   例子   nbsp   ges   释放   log   printf   方式   注意   

  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;

     

    [root@localhost 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 }
    ~            
    [root@localhost 01基础测试]# ./demo2
     0xf1a003
     0xf1a002
     0xf1a005
     0xf1a007
     0xf1a008
    asdf

     

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

标签:int   例子   nbsp   ges   释放   log   printf   方式   注意   

原文地址:http://www.cnblogs.com/jasongl/p/7120994.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!