当前位置: 首页 > news >正文

brk/sbrk的使用

linux中几种管理内存的方式有:STL,new/delete,malloc/free,brk/sbrk,mmap/unmap

brk/sbrk:提供底层的内存分配函数

功能是共同维护系统的一个指针,主要用于对同类型的大块数据的动态存放,定义如下:

int brk(void *end_data_segment); // 通过移动指针分配空间,释放空间
void* sbrk(ptrdiff_t increment); // 分配内存空间,返回指定大小空间的地址

sbrk用法:第一次调用时,系统分配一大块空闲地址,把首地址返回,分配给一个指针phead,作为首地址不动;下一次调用时,返回当前位置的地址,分配给一个指针pnow,并把指针指向+increment的地方;

brk用法:对参数中pnow做绝对位置调整,调动指针左右移动,左移-释放空间,右移-分配空间

如果内存分配失败,二者都返回-1

注意:

1、每个进程可访问的虚拟内存空间为3G,在程序编译时,系统只分配并不大的数据段空间,称为1页,共4096字节,如果这块空间不够,就使用sbrk函数将数据段的下界移动,获得新的空间,这也是malloc的原理。

2、phead和pnow之间的内存空间才是合法内存,在没有分配空间的地方存取数据会发生段错误,在合法内存之外存取数据会发生越界,导致不可预知的错误。

例:将1-10000之间的所有素数存放到缓冲,并输出

#include <stdio.h>
#include <unistd.h> // 使用brk/sbrk,需要使用这个头文件
int main()
{
    //存放数据
    int i = 2;
    int* phead; // 指向首位置
    int* pnow; // 指向当前指针位置
    pnow = sbrk(0); // 先分配空闲区域
    phead = pnow; // 固定首位置不变
    for(i=2; i<10000; i++)
    {
        if(isPrime(i)) // 该函数用于判断是否是素数
        {
           brk(pnow+1);// 分配4个字节
            *pnow = i; // 存入数据
            pnow = sbrk(0); // 指向系统指针上次移动到的那个位置
        }
    }

    //打印数据
    pnow = phead; // 从头打印
    while(pnow!=sbrk(0))
    {
        printf("%d\n",*pnow);
        pnow++;
    }
    brk(phead); // 释放空间
}

转载于:https://www.cnblogs.com/shayu/p/3371880.html

相关文章:

  • 我们要和你完成一件大事
  • Eclipse中文乱码问题
  • Vue 动态创建 component
  • ACM经典问题--布线问题(三)
  • 自然语言处理--Word2vec(一)
  • HDU3068(最长回文串)
  • redis初识
  • 头指针与头结点的异同
  • Npoi将excel数据导入到sqlserver数据库
  • OpenStack导入镜像后Launch不起来的几个问题
  • zookeeper 面试题 有用
  • 如何写PHP规范注释
  • /proc/stat文件详解(翻译)
  • Android性能:通过Choreographer检测UI丢帧和卡顿
  • java提高篇(五)-----使用序列化实现对象的拷贝
  • [nginx文档翻译系列] 控制nginx
  • 03Go 类型总结
  • es6--symbol
  • Java IO学习笔记一
  • LeetCode18.四数之和 JavaScript
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • mysql 数据库四种事务隔离级别
  • 回流、重绘及其优化
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 看域名解析域名安全对SEO的影响
  • 前端js -- this指向总结。
  • ​批处理文件中的errorlevel用法
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​水经微图Web1.5.0版即将上线
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #宝哥教你#查看jquery绑定的事件函数
  • (12)Hive调优——count distinct去重优化
  • (6)设计一个TimeMap
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)http-server应用
  • .axf 转化 .bin文件 的方法
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 5种线程安全集合
  • .net framework profiles /.net framework 配置
  • .net 托管代码与非托管代码
  • .net打印*三角形
  • .net访问oracle数据库性能问题
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @Valid和@NotNull字段校验使用
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429