gpt4 book ai didi

c - 微内存管理器错误

转载 作者:行者123 更新时间:2023-11-30 14:23:05 25 4
gpt4 key购买 nike

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

我基本上是在创建已分配 block 的双向链表,其中我将指针放在每个 block 的开头的上一个和下一个上。 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

当我针对此错误打印分配 block 的地址(wantedSize = 20 * sizeof(int),尝试写入第一个 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));

关于c - 微内存管理器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13213621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com