((char *) last) + last->size == (char *) blk_ptr 解析

struct blk {
  size_t size; // long unsigned int 8
  struct blk *prev; // 8
  struct blk *next; // 8
};

struct blk *first = NULL;
struct blk *last = NULL;

blk 结构体示意:
blk struct
这里 blk 表示分配的内存的结构体,blk->size 大小包含 blk 结构体本身的大小及分配的内存的大小,地址连续,起始位置为 blk 指针指向的位置。

// void malloc(size_t size)
// ...
 if (curr == NULL) {
    void *new = sbrk((intptr_t) required_size);
    if (new == (void *) -1) { return NULL; }
    struct blk *new_blk = (struct blk *) new;
    new_blk->size = required_size;
    return (void *) (new_blk + 1);
  }
// ...
// ...
if (blk_ptr > last) {
		//什么要将结构体 blk 指针转换为 char * 指针?
    if (((char *) last) + last->size == (char *) blk_ptr) { // @todo 判断 last 与 blk_ptr 是否连续
      last->size += blk_ptr->size;
    } else {
      blk_ptr->next = NULL;
      blk_ptr->prev = last;
      last->next = blk_ptr;
      last = blk_ptr;
    }
    return;
  }
// ..

last 指针转换为 char * 指针后,对其进行算术运算操作,这里是 ((char *) last) + last->size, 使指针前进指定的字节数,然后比对其指针位置是否与 blk_ptr 相同,相同则表示两块 blk 结构体表示的内存块连续,则将 blk_ptr 插入双向链表的末尾,成为 last.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值