c - 理解和实现 malloc

标签 c malloc realloc

malloc 内部是如何实现的?如何在以下必要条件下实现 malloc

• Malloc 至少分配请求的字节数

• malloc 返回的指针指向分配的空间(即程序可以成功读取或写入的空间;)

• 除非之前已释放指针,否则对 malloc 的其他调用不会分配此空间或其中的任何部分。

• malloc 应该易于处理:malloc 必须尽快终止(它不应该是 NP-hard !;)

• Malloc 还应提供大小调整和释放。

函数遵循以下签名: void * malloc(size_t size);

最佳答案

解决方法: 为了编写 malloc,我们需要知道堆的开始位置和中断位置, 当然,我们需要能够移动休息时间。我们将使用 sbrk() 系统调用来实现这一点。

enter image description here

Sbrk(n) 将中断移动给定的增量 n(以字节为单位。)

sbrk的特例:当increment为null时(即sbrk(0)),返回值为实际的break地址(新的break地址相同),因此sbrk用于检索break的开头break起始位置的堆

步骤-1 实现(不满足所有标准) enter image description here

但在满足高级目标时,它会根据请求的大小移动断点,用户将在堆上分配内存,而不满足重新分配并允许它释放的条件 1)所以我们需要知道每个部分从哪里开始以及我们何时在下一个部分的每个部分地址的开始处。 2)那部分的大小是多少 3)该部分是否免费 enter image description here

所以基本上我们需要一个包含以下内容的列表 enter image description here

免费使用 int 似乎是个坏主意,但由于结构默认对齐,所以这无关紧要。

我们必须注意的另一个条件是 malloc 必须返回对齐的地址。如上所示,元部分已经对齐,我们只需要确保数据部分也是如此。 enter image description here

寻找 block Base 是指向堆起点的全局指针 enter image description here

Extending Heap – 很简单,我们只是移动断点。 enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

现在我们可以执行我们的 malloc 函数,它只是所有经过的小块的包装 enter image description here

关于c - 理解和实现 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32388847/

相关文章:

c - PIC24F16KA102 上的定时器 1 不工作

c++ - C 和 C++ 类型转换的区别?

c - 程序从给定字符串中删除所有连续的相同字母

c - 需要检查C中malloc返回的指针

c - 如果 Realloc() 失败,调用者是否会丢失前一个 malloc() 调用中的数据?

c - 在 C 中使用 Realloc

C - 收到 SIGABRT 错误,对我来说没有任何意义

c - 扫描成阵列

无法在 malloc() 处设置断点

c malloc 用于二维 char 数组,通过将此数组传递给函数