5.4 地址算数运算

#define ALLOCSIZE 10000 /* 可用空间大小*/
static char allocbuf[ALLOCSIZE]; /* alloc使用的存储区*/
static char *allocp = allocbuf; /* 下一个空闲位置*/
char *alloc(int n) /* 返回指向n个字符的指针*/
{
if (allocbuf + ALLOCSIZE - allocp >= n ) { /* 有足够的空闲空间*/
allocp += n;
return allocp - n; /* 分配前的指针*/
} else /* 空闲空间不够*/
return 0;
}
void afree(char *p) /* 释放p指向的存储区*/
{
if (p >= allocbuf && p <allocbuf + ALLOCSIZE)
allocp = p;
}
    alloc函数返回一个指向n个字符存储单元的指针,afree函数释放p指针指向的存储区。主要的思想是定义一个static型的大字符数组allocbuf,只能被alloc和free访问,alloc(n)判断是否有n个字符的空闲单元,若有足够的空间则返回空闲单元开始的地址,若没有则返回0;afree(*p)判断p是否指向allocbuf的单元,若是则释放p指向的单元。重点是allocbuf + ALLOCSIZE - allocp >= n 的操作,指针若指向同一个数组,则可以进行+ - 运算及== != <= >=等关系运算。指针的算术运算具有一致性:如果处理的是比字符类型占据更多存储空间的浮点类型,并且p是一个指向浮点类型的指针,那么执行p++后p就指向下一个浮点数的地址。因此只需将alloc和afree函数中所有的char类型替换为f l o a t类型,就可以得到一个针对浮点类型而不是字符类型的内存分配函数版本。所有的指针运算都会自动考虑它所指对象的大小。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值