C 微内存管理器错误

C 微内存管理器错误,c,memory-management,malloc,C,Memory Management,Malloc,我试图在我的C程序中编写简单的内存管理器(我应该说是内存跟踪器) 我基本上是在创建分配块的双链接列表,我在每个块的开始处将指针放在上一个和下一个上。Malloc过程如下所示: typedef struct MemUnit TMemUnit; struct tMemUnit { TMemUnit *prev; TMemUnit *next; } TMemUnit *new = malloc(sizeof(TMemUnit)

我试图在我的C程序中编写简单的内存管理器(我应该说是内存跟踪器)

我基本上是在创建分配块的双链接列表,我在每个块的开始处将指针放在上一个和下一个上。Malloc过程如下所示:

    typedef struct MemUnit TMemUnit;
    struct tMemUnit
    {
        TMemUnit *prev;
        TMemUnit *next;
    }

    TMemUnit *new = malloc(sizeof(TMemUnit) + wantedSize);
    if (new == NULL)
        /* ERROR */
    else
    {
        if (memFirst == NULL) {
            memFirst = new;
            memLast = new;
            new->prev = NULL;
            new->next = NULL;
        } else {
            new->prev = memLast;
            new->next = NULL;
            memLast->next = new;
            memLast = new;
    }
    return (void *)(new + sizeof(TMemUnit));
问题是在以前没有的地方分割错误

Valgrind还提供无效的读/写错误

==22872== Invalid write of size 4
==22872==    at 0x400FF1: main (test-memory.c:40)
==22872==  Address 0x54d51b0 is not stack'd, malloc'd or (recently) free'd
当我为这个错误打印分配块的地址(wantedSize=20*sizeof(int),尝试写入第一个int)时,它们看起来正常:

new --> 0x54d5030
new + sizeof(TMemUnit) + wantedSize --> 0x54d5430
我不知道我的错误在哪里

谢谢

尝试使用return(void*)(new+1)代替return(void*)(new+sizeof(TMemUnit))


指针算术(p+n)已经以sizeof(*p)为单位计数。

问题可能在于:

return (void *)(new + sizeof(TMemUnit));
您的
new
指针的类型为
TMemUnit*
,因此根据C指针算法的规则,您将添加
sizeof(TMemUnit)*sizeof(TMemUnit)
字节,这太多了。相反,请尝试:

return (void *)((char *)new + sizeof(TMemUnit));

您可能希望
返回(void*)((char*)new+sizeof(TMemUnit))

备选方案:返回(无效*)和新建[1];我会考虑避免使用C++关键字<代码>新< /COD>。这里没有问题。我知道,但是C可以用C++编译器编译,编写可重用代码是很好的。