指针问题,出现访问异常

2301_81534334 2024-07-20 11:05:07

 

运行出现访问异常内存,该如何修改,我这个错在哪里

...全文
1129 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
从以前 2025-01-04
  • 打赏
  • 举报
回复

你的代码运行出现访问异常的原因可能是指针操作过程中对链表节点的访问和修改不正确。以下是对你的代码问题的分析以及建议修改:

代码问题分析
头指针初始化错误:

cpp
复制代码
Node* head = 1;
这里将 head 初始化为 1 是错误的,head 应该指向链表的头节点,而不是直接赋值为一个整数值。这样会导致 head->next 的访问异常,因为 1 并不是有效的地址。

节点访问边界问题: 在 for 循环中:

cpp
复制代码
for (i = 1; i < locate && head->next; i++) {
head = head->next;
}
如果 locate 超出了链表的实际长度,head 可能会被移动到空指针上,随后代码中的访问 head->next 会导致访问异常。

链表断链问题: 当你删除节点时:

cpp
复制代码
head = temp->next;
这里并未正确更新上一个节点的 next 指针,可能会导致链表断开。

内存释放和数据访问问题: 在释放节点 temp 的内存后,你的代码试图返回该节点的 date 值:

cpp
复制代码
free(temp);
return delete_date;
如果释放内存后访问 delete_date,在某些系统下可能导致未定义行为(因为 delete_date 引用的值可能已经被释放)。

Mr.苏.C 2025-01-08
  • 举报
回复
@从以前 那是传进来的参数l
Hello.Reader 2024-11-09
  • 打赏
  • 举报
回复 1

问题分析

在你提供的代码中,存在以下几个问题:

  1. head 初始化错误Node* head = 1; 会导致 head 指针指向非法内存。应该初始化为传入的链表头指针 l,即 Node* head = l;

  2. 访问越界检查:在遍历过程中,如果 locate 超过了链表长度,或者 head 指针已经是 nullptr 时继续访问 head->next,会导致非法访问。

  3. 目标节点前一个节点的处理:删除操作需要找到待删除节点的前一个节点,以便正确更新指针。

修改后的代码

我们将正确地初始化 head,并在遍历过程中增加边界检查,以确保不越界访问。

Date delete_node(Node* l, int locate) {
    if (l == nullptr || locate <= 1) {
        throw std::out_of_range("Invalid locate or empty list");
    }

    Node* head = l;
    Node* temp;
    int delete_date;

    // 找到待删除节点的前一个节点
    for (int i = 1; i < locate - 1; i++) {
        if (head->next == nullptr) {  // 若locate超出链表范围
            throw std::out_of_range("locate 超出链表范围");
        }
        head = head->next;
    }

    // 删除节点
    temp = head->next;
    if (temp == nullptr) {  // 检查是否已经到达链表末尾
        throw std::out_of_range("locate 超出链表范围");
    }
    delete_date = temp->data;
    head->next = temp->next;
    free(temp);

    return delete_date;
}

代码解释

  1. 输入参数检查:首先检查 l 是否为 nullptr,以及 locate 是否为有效位置(>1),否则直接抛出异常。

  2. 遍历到待删除节点的前一个节点:使用 for 循环找到 locate - 1 的位置,即待删除节点的前一个节点。如果在过程中 head->nextnullptr,说明 locate 超出链表长度,直接抛出异常。

  3. 删除操作:一旦找到待删除节点的前一个节点,temp 指向 head->next(即待删除节点)。如果 tempnullptr,说明已经到达链表末尾,locate 无效,抛出异常。

  4. 返回删除的数据:在成功删除节点后,返回被删除节点的 data 值。

额外注意

确保链表的内存管理正确,防止内存泄漏或野指针访问。如果 locate 为 1,表示要删除头节点,可以单独处理这种情况。

寂然如故 2024-07-22
  • 打赏
  • 举报
回复 1

&&(head-> next != NULL)

火花20180731 2024-07-22
  • 打赏
  • 举报
回复 5

先不说别的,你这个head->next为空就是循环退出的条件之一,后面居然就直接temp = head->next了,如果在i超出locate之前就head->next就为空,那你就是在试图把temp设为空指针,然后还试图访问和free一个空指针。
再者,你下标既然要从1开始而不从0开始(什么臭毛病?),那你这个locate难道不应该<=吗?链表插了3个节点,我输入3,然后我访问到2循环就退出了?

大大大钢琴 2024-07-21
  • 打赏
  • 举报
回复

&&(head-> next != NULL)

forever74 2024-07-20
  • 打赏
  • 举报
回复

head->next=temp->next;

深东编程 2024-07-20
  • 打赏
  • 举报
回复

&&(head-> next != NULL)

kylandzwr2 2024-07-23
  • 举报
回复
@深东编程 下午
kylandzwr2 2024-07-23
  • 举报
回复
@kylandzwr2 嗯嗯嗯
深东编程 2024-07-25
  • 举报
回复
@深东编程 几行代码问题还很多,怎么编程的啊。指定了一个临时节点都没有申请内存。干嘛要释放内存呢? 如果要删除节点释放内存,应该从第一个节点开始循环到最后那个节点为止。 head=temp-&gt;next 是无用代码 任何变量名都不能用纯数字 只能是_或者字母开头 i=0; 如果要找第几个节点就输入几,比如说5 那么0--4 就是循环5次了
tcmakebest 2024-07-20
  • 打赏
  • 举报
回复

没有IF语句的指针操作,楼主是真不怕空指针啊

hangxingdemeng 2024-07-20
  • 打赏
  • 举报
回复

整型的“1”不能被当作“Node*”类型的指针名,在获取参数的时候就有异常。指针名的取名规则应该和变量的取名规则一致

70,040

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧