C 函数中的错误从链接列表中释放

C 函数中的错误从链接列表中释放,c,linked-list,operating-system,C,Linked List,Operating System,我很难找到我的代码错误 我得到一个内存地址作为参数,需要从列表(堆)中释放 列表结构: 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

我很难找到我的代码错误

我得到一个内存地址作为参数,需要从列表(堆)中释放

列表结构:

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;
    }
}

您的cast
free\u node\u t*元数据=(void*)ptr-sizeof(free\u node\t)不做任何事情,因为
ptr
作为无效指针传递,并且不能减少无效指针

free()
是一个释放您分配的内存的函数,请参见此处:您不能使用
void*
指针执行指针算术。您需要将其强制转换为类似于
char*
的类型。但是,我需要实现free。您正在执行自己的内存管理,而不是使用
malloc()
free()
?是的,没错。分配成功了,我在Free中遇到了问题,应该告诉你不能取消引用强制转换指针。什么?@AjayBrahmakshatriya为这一混乱感到抱歉;我删除了关于我怀疑的内容的旁注,并将答案限制在问题中的信息上。该注释本身没有问题,只是术语“投射指针”无效。我想你指的是void指针。不,一个被转换成不同类型的指针就是转换指针。“Cast”是动词“to Cast”的现在时态和过去时态。我意识到有些人使用“铸造”一词,但这在语法上是不正确的。