c - malloc指针识别

标签 c pointers malloc free

所以我有这个任务来在 C 中实现我自己的 malloc 和 free。问题是 memory_free(void *ptr) 函数的要求之一。如果指针无效,它必须返回 1,即它没有被 memory_alloc(unsigned int size) 分配,否则返回 0。我只是想不出一种方法来做到这一点,而且绝对没有时间效率。

所以我的内存结构是这样的:我有一个指向数组开头的全局指针,我可以充当堆。每个内存块都有一个 int header 来说明它的大小以及它是否空闲。

这是我现在的 memory_free(void *ptr) 函数,类型是 typedef unsigned int:

int memory_free(void *ptr)
{
    void *head = ptr;
    if (head == NULL)
        return 1;
    head -= sizeof(TYPE);
    if (!((*(TYPE*) head) & 1 ))
        return 1;
    (*(TYPE*) head) &= ~0x1;
    return 0;
}

指针ptr指向user block的第一个字节,也就是说,如果我要读header,就得往回走4个字节。检查指针有效性的一种解决方案是从头开始遍历堆,看看我是否得到了有问题的 header ,但这不是时间效率。谁能告诉我更好的方法?

最佳答案

一个 O(1) 的解决方案是将 header 设为 8 个字节而不是 4 个字节;使用额外的四个字节来指示有效性。例如,它可以是您存储在其他四个字节中的内容的补码。因此,您查看 header ,如果这些额外字节包含 header 第一部分的补码以外的任何内容,您就知道它不是有效 block 。

关于c - malloc指针识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26300232/

相关文章:

c - 如何在c中对结构体数组进行malloc

c++ - 在多线程 C/C++ 中,malloc/new 在分配内存时是否锁定堆

c - 是否可以在不使用 malloc 的情况下返回指向结构的指针?

Python3 C 库的使用

c - 如何只输入一个EOF结束scanf

c - 以下处理指针的代码有什么问题?

签名中带有数组类型的 ccall 从 Julia 调用 C 中的结构

c++ - C/C++ 中将数组作为形式参数传递为 int arr[] 和 int arr[N] 之间的区别

c - 为什么命令\n 跳线时不按顺序排列?

c++ - 处理包含动态分配成员的对象的 vector