我无法找到代码的错误...
我获取一个内存地址作为参数,需要从我的列表(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/