【问题标题】:Weird values in free() function Cfree() 函数 C 中的奇怪值
【发布时间】:2021-04-07 10:22:18
【问题描述】:

我想删除链表的第一个节点(您可以在图片下方看到)

结构如下:

typedef struct PageEntry {  //Node
    unsigned int page_number;
    char mode;
    int count, R;
    struct PageEntry *next;
}PE;


typedef struct Element {
    int val;
    PE* pe;
}Element;

typedef struct PageTable {
    int p_faults, reads, writes, disk_writes, maxFrames, usedFrames;
    char* algorithm;
    Element* el;
}PT;

我尝试删除第一个节点的代码在这里。

PE *cur = pt->el[pos].pe;
PE *prev =NULL, *temp = cur;
if(cur->count == min){  //head node
    if(cur->mode == 'W'){
        pt->disk_writes++;
            
    }
    if (cur->next == NULL) {
        memset(cur, 0, sizeof(PE));
        free(pt->el[pos].pe);
        cur = NULL;
    }
    else {
        cur = temp->next;
        free(temp);
    }

我正在使用 Visual Studio,当我空闲时,我会返回一些奇怪的值,如您在截图中看到的那样。我无法理解发生了什么

【问题讨论】:

  • 删除列表第一个元素时,需要将页表改为指向第二个元素。
  • 你刚刚分配了cur,你没有更新页表。

标签: c free


【解决方案1】:

您的图表描述的不是列表,而是列表数组。这本身就很好。但是 - 你为什么要将实际列表的代码与使用整个页表的代码混为一谈?目前尚不清楚您决定删除列表节点(即页面条目)的确切位置。您还隐含地假设列表不为空。你是在不必要地进行记忆。最后,也是最重要的——当你free(temp) 时——你没有设置pt->el[pos].pe 指向cur->next。因此,它继续指向您刚刚释放的元素。

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 2018-09-29
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多