我正在尝试在我的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
我无法弄清楚我的错误在哪里。
由于
答案 0 :(得分:2)
问题可能出在这里:
return (void *)(new + sizeof(TMemUnit));
您的new
指针的类型为TMemUnit *
,因此根据C指针算法的规则,您将添加sizeof(TMemUnit) * sizeof(TMemUnit)
个字节,这太多了。相反,尝试:
return (void *)((char *)new + sizeof(TMemUnit));
答案 1 :(得分:0)
尝试return(void *)(new + 1)而不是return(void *)(new + sizeof(TMemUnit))
指针运算(p + n)已经以sizeof(* p)为单位进行计数。
答案 2 :(得分:0)
您可能需要return (void *)((char *)new + sizeof(TMemUnit));