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

标签 c linked-list operating-system

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

我获取一个内存地址作为参数,需要从我的列表(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/

相关文章:

python - 按照定义的比率赋值

c++ - 将链表的大小从 '__int64' 截断为 'size_t

python - 当我的程序崩溃时,打开的文件会发生什么情况?

c - UNIX系统编程中的S_IFMT是什么?

c - 这是一个有效的 C 程序吗?

c++ - getaddrinfo 内存泄漏

c - 双链表插入麻烦

C 链表初始化

c - 删除单向链表中的节点

python - python os.rename找不到文件,即使代码检查它是否存在