gpt4 book ai didi

c - 从链表中释放函数时出错

转载 作者:行者123 更新时间:2023-11-30 16:43:52 25 4
gpt4 key购买 nike

我无法找到代码的错误...

我获取一个内存地址作为参数,需要从我的列表(HEAP)中释放

列表结构:

typedef struct free_node {
size_t free;
size_t size;
struct free_node *next;
} free_node_t;

typedef struct {
free_node_t *head;
free_node_t *lastAlloca; // Usado para next fit
} free_list_t;

我需要做一个释放ptr内存地址的函数

void libera(void *ptr) {

free_node_t *metaData = (void*)ptr - sizeof(free_node_t);
assert(HEAP->lastAlloca != NULL);
free_node_t *listNavigator = HEAP->head;

while(listNavigator != NULL) {
if(listNavigator->next == metaData) {
listNavigator->next = metaData->next;
listNavigator->free += metaData->size + metaData->free + sizeof(free_node_t);
break;
}
listNavigator = listNavigator->next;
}
}

但是,它不起作用。当我针对某些段错误情况进行编译时。

请帮助我:)

最佳答案

看起来您正在尝试实现跟踪内存分配器。要获取元数据的偏移量,您必须使用临时指针,如下所示:

void libera(void *ptr) {

free_node_t *temp = (free_node_t*)ptr;
free_node_t *metaData = temp - sizeof(free_node_t);
assert(HEAP->lastAlloca != NULL);
free_node_t *listNavigator = HEAP->head;

while(listNavigator != NULL) {
if(listNavigator->next == metaData) {
listNavigator->next = metaData->next;
listNavigator->free += metaData->size + metaData->free + sizeof(free_node_t);
break;
}
listNavigator = listNavigator->next;
}
}

您的转换 free_node_t *metaData = (void*)ptr - sizeof(free_node_t); 不会执行任何操作,因为 ptr 作为 void 指针传递,并且您无法减少 void 指针。

关于c - 从链表中释放函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44895803/

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