c语言 - K&R 中的指针加法

  • 本文关键字:指针 语言 c malloc
  • 更新时间 :
  • 英文 :


在K&R的malloc()过程中,第187页:

 p->s.size -= nunits;
 p += p->s.size;
 p->s.size = nunits;

更改 p 大小的第一个调用也会更改其在 prevp(其容器指针)内的大小。 添加地址后,第二次调用仅更改 p 的大小。 += 操作是否创建了可以在不更改初始 p 的情况下进行操作的 p 副本?

整个想法是重用以前释放的块。块的大小已被检查为大于 nunits(函数 nbytes 的参数加上一些开销)

// we need nunits bytes from the original free sized block
p->s.size -= nunits; 
// move the pointer size bytes forward 
p += p->s.size; 
// now we are at the block we want to return, set correct size.
p->s.size = nunits;

例如

释放的块有 100 个字节,NUNITS 是 60 个字节,所以我们要使用该块的 60 个字节,并将 40 个字节留给另一个 malloc。

首先,我们将剩余大小更改为 40 (p->s.size = 40)然后我们将指针向前移动 40 个字节(这 40 个保持空闲)现在 p 指向我们将返回的块的开头,现在我们设置分配块的大小 (p->s.size = 60)

+=操作是否创建可操作的p副本 不改变初始p

答:不可以。例如在p += some_value中,+=运算符等价于p = p + some_value。使用+=时,您将始终更改左值。否则,这将使+=运算符变得毫无意义。

相关内容

  • 没有找到相关文章

最新更新