【发布时间】:2022-01-06 17:37:34
【问题描述】:
我正在尝试在 c 中实现我自己版本的 malloc() 函数。 我决定使用元数据对象的链接列表来跟踪我分配的块,该链接列表将存储有关已分配块的一些信息并将其放置在块之前。 现在长话短说,在调试时我发现我的链表表现得非常奇怪。 这里有一段代码可以帮助理解问题。
typedef struct meta_data
{
size_t size;
int free;
struct meta_data* next;
}meta_data;
meta_data* global_base;
void *mymalloc(size_t size)
{
if(size > 0)
{
meta_data block_meta;
void* pointer = sbrk(size + block_size);
block_meta.size = size;
block_meta.next = NULL;
block_meta.free = 0;
if(!global_base) //first allocation
{
global_base = &block_meta;
}
else
{
block_meta.next = global_base;
}
return pointer;
}
else
{
return NULL;
}
}
我编写了这段代码,我假设每次调用 mymalloc(
void printList()
{
meta_data * node = global_base;
while (node->next != NULL)
{
printf("%zu", node->size);
printf(" -> ");
node = node->next;
}
printf(" \n ");
}
int main()
{
mymalloc(10);
mymalloc(8);
mymalloc(4);
printList();
return 0;
}
我希望我的输出是
10 -> 8 -> 4 但它是 4 -> 4 -> 4 -> 4 -> 4 ..... 并进入无限循环
知道这段代码哪里出错了。
我对使用 C 编程有点陌生,所以我唯一的猜测是我不正确地使用了引用 & 和指针 *。
此外,我还看到过使用-> 来分配结构属性的代码,但我只能使用. 来实现(无论如何这可能是问题所在)?
感谢大家的帮助
【问题讨论】:
-
您正在为初学者打印
list->size,而不是node->size。而且我在任何地方都没有看到list的定义 -
所以请不要键入。复制并粘贴正确的minimal reproducible example。
-
你为什么使用
sbrk?这似乎有点复杂。你不能在幕后使用 malloc 吗? -
@jarmod OP 正在尝试实施
malloc。 -
block_meta在mymalloc返回时已超出范围,但您将此地址保存为global_base,并在后续调用mymalloc和printList时继续尝试使用该地址。
标签: c linked-list infinite-loop singly-linked-list