0

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

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

谢谢

4

3 回答 3

2

问题可能出在这里:

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

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

return (void *)((char *)new + sizeof(TMemUnit));
于 2012-11-03T21:26:55.420 回答
0

尝试使用 return (void*)(new + 1) 而不是 return (void*)(new + sizeof(TMemUnit))

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

于 2012-11-03T21:26:05.280 回答
0

你可能想要return (void *)((char *)new + sizeof(TMemUnit));

于 2012-11-03T21:27:05.103 回答