在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
。使用+=
时,您将始终更改左值。否则,这将使+=
运算符变得毫无意义。