动态内存分配器

问题描述 投票:-1回答:1

给出以下问题,并在下面提供答案:

enter image description here

enter image description here

如何计算绿色轮廓区域中的值?我相信我对C中的free()函数如何工作以及它的作用有很好的理解:清除动态分配在堆堆栈上的内存块(将其完全删除,或使其免费使用,以供将来分配) )。

我不明白,对free(0x400b010)的调用如何仅更改上面的其他一些堆块? (我用绿色勾勒出的轮廓)。我得到的地址0x400b010(具有二进制值:01000000 00001011 01100000 00011100不会更改,根据已释放的分配,其中0中包含bit 0

有人可以向我解释吗?例如,当在上面的块上调用free时,地址0x400b00c:0x000000013上的块将其值(:之后的第二个参数)更改为0x00000022。此示例只是其中几种奇怪的情况之一,即使先前未分配空闲地址的调用,先前分配的块(在1中的bit 0)也变为空闲。

类似的一些块改变了它们的值,而另一些没有改变。

我试图以多种不同方式参与该示例,但我无法弄清楚为什么该解决方案采用这种方式,因此我希望这里的人可以向我解释到底发生了什么。

c heap heap-memory dynamic-memory-allocation
1个回答
0
投票

malloc返回的指针(然后传递给free)指向该块的用户内容的第一个字节,而不是标题(或页脚)。因此,要在free中找到块的标题,您需要从指针参数中减去4(标题的大小)。

因此,当调用free(0x400b010)时,第一件事是减去4并在0x400b00c处获得块的标题,即0x13。这告诉您该块为16字节(0x10),并且正在使用(已设置位0),而上一个块正在使用(已设置位1)。

© www.soinside.com 2019 - 2024. All rights reserved.