V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ivito
V2EX  ›  程序员

malloc 函数实现

  •  
  •   ivito ·
    fireboyvt · 2014-12-24 09:30:09 +08:00 · 2864 次点击
    这是一个创建于 3623 天前的主题,其中的信息可能已经有所发展或是发生改变。
    见到网上一片文章用系统调用sbrk实现malloc。
    http://blog.jobbole.com/82511/
    sbrk(0)会返回指向当前堆顶部的指针。sbrk(foo)会增加foo字节的堆空间并返回指向当前堆顶部的指针。
    #include <assert.h>
    #include <string.h>
    #include <sys/types.h>
    #include <unistd.h>

    void *malloc(size_t size) {
    void *p = sbrk(0);
    void *request = sbrk(size);
    if (request == (void*) -1) {
    return NULL; // sbrk failed
    } else {
    assert(p == request); // Not thread safe.
    return p;
    }
    }
    但是if语句中的 (void*)-1 是什么意思呢
    6 条回复    2014-12-24 10:09:30 +08:00
    carmark
        1
    carmark  
       2014-12-24 09:44:57 +08:00
    sbrk函数调用成功返回一指针,指向下一个内存空间。函数调用失败则返回(void*)-1,将errno设为ENOMEM。

    查查sbrk的manpage就能看到了。
    semicircle21
        2
    semicircle21  
       2014-12-24 09:47:51 +08:00
    就是判断 sbrk 返回的是不是-1, 加了个类型转换而已,
    眼花了?
    ivito
        3
    ivito  
    OP
       2014-12-24 09:48:33 +08:00
    @carmark 已找到,感谢
    On success, brk() returns zero. On error, -1 is returned, and errno is set to ENOMEM. (But see Linux Notes below.)
    ivito
        4
    ivito  
    OP
       2014-12-24 09:49:26 +08:00
    @semicircle21 一时没想过来,之前没见过用负数表示地址的
    icenan2
        5
    icenan2  
       2014-12-24 09:49:40 +08:00
    -1 转换成(void*)应该就是地址的最大值吧
    ivito
        6
    ivito  
    OP
       2014-12-24 10:09:30 +08:00
    @icenan2 对,全f
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2744 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:35 · PVG 14:35 · LAX 22:35 · JFK 01:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.