C-微型内存管理器错误



我正在尝试在我的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

当我打印分配的块的地址(wantsize = 20 * sizeof(int),试图首先写入此错误)时,它们看起来还可以:

new --> 0x54d5030
new + sizeof(TMemUnit) + wantedSize --> 0x54d5430

我不知道我的错误在哪里。

谢谢

问题可能在这里:

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

您的new指针是TMemUnit *类型,因此,根据C指针算术的规则,您将添加sizeof(TMemUnit) * sizeof(TMemUnit)字节,这太多了。而是尝试:

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

您可能需要return (void *)((char *)new + sizeof(TMemUnit));

尝试返回(void*)(new 1)而不是返回(void*)(new sizeof(tmemunit))

指针算术(p n)已经在sizeof(*p)的单位中计数。

相关内容

最新更新