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
时间: 2024-08-02 15:45:33

brk 和 sbrk()的使用 及分配内存方式的相关文章

内存分配原理 -进程分配内存的两种方式,分别有系统调用完成brk() 和mmap()(不设计共享内存)

如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误.           这两个数值表示一个进程自启动以来所发生的缺页中断的次数. 发成缺页中断后,执行了那些操作? 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0

c malloc分配内存

php中的内存分配有用类似emalloc这样的函数,emalloc实际上是C语言中的malloc的一层封装,php启动后,会向OS申请一块内存,可以理解为内存池,以后的php分配内存都是在这块内存池中进行的,以至于efree,也不会向OS退回内存,而只是设置标志位,标识efree这块内存不再使用了,这样做的好处是,速度快,避免系统调用,因为频繁的从用户态和内核态之间的切换是很费CPU的. C语言的malloc函数的后面是glibc(内存管理系统) , 前段时间在看到php内存分配时,看到了ema

C/C++ 使用mmap/munmap函数分配内存

在C/C++ 中常用的内存分配和管理的方式有很多,如智能指针, STL容器, new/delete, malloc/free, brk, sbrk等等,最近研究了一下Unix比较底层的一种内存管理方式mmap/munmap,需要完全自己来维护分配的虚拟内存,没有任何其他辅助的数据结构来帮助维护内存空间. 一.在终端里输入 man mmap 可以查看此函数的API文档,此函数的具体描述如下: void *mmap(void *start,size_t length,int prot,int fla

Linux中brk()系统调用,sbrk(),mmap(),malloc(),calloc()的异同【转】

转自:http://blog.csdn.net/kobbee9/article/details/7397010 brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的:       每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的.如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理

brk()和sbrk()使用方法解析

brk() , sbrk() 的声明如下: [cpp] view plaincopy #include <unistd.h> int brk(void *addr); void *sbrk(intptr_t increment); 首先说明一点 sbrk()是函数库调用,brk()是系统调用 这两个函数都用来改变 "program break" (程序间断点)的位置,这个位置可参考下图: 如 man 里说的: 引用 brk()  and  sbrk() change the

@清晰掉 malloc是如何分配内存的?

任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉.但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字.实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很容易理解. 这篇文章通过实现一个简单的malloc来描述malloc背后的机制.当然与现有C的标准库

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

一只菜鸟横空出世,码农世界闯一闯,每天进展多一丢丢. brk()与sbrk()函数的学习与使用 brk()与sbrk()函数定义如下: #include <unistd.h> int brk(boid *addr): addr:把内存末尾指针设置为addr.返回值:0表示成功,非0表示失败 void *sbrk(intptr_t increment); increment:把内存的末尾指针移动increment个字节.返回值:上次调用sbrk/brk的内存末尾指针. 内容摘选转自:https:

brk 和 sbrk 区别

转自:https://www.cnblogs.com/chengxuyuancc/p/3566710.html brk和sbrk的定义,在man手册中定义了这两个函数: 1 #include <unistd.h> 2 int brk(void *addr); 3 void *sbrk(intptr_t increment); 手册上说brk和sbrk会改变program break的位置,program break被定义为程序data segment的结束位置.感觉这句话不是很好理解,从下面程

OpenCV 2.4.9 学习笔记(3)—— OpenCV自动为输出数组(矩阵)分配内存

OpenCV大部分时候会为OpenCV方法中的输出数据(方法的参数)自动分配内存,所以如果一个方法的参数有一个或者多个输入数组(cv::Mat 实例)和一些输出数组时,OpenCV会自动为输出数组分配内存空间或者重新分配内存空间,内存的大小和数据类型由输入数组决定.如果需要的话,这个方法会通过其他的参数来决定输出数组的其他属性. 下面用一段代码来说明一下: 1 #include "cv.h" 2 #include "highgui.h" 3 4 using name