【发布时间】:2021-06-24 09:23:30
【问题描述】:
我遇到了运行时错误,我不知道为什么。我尝试回溯,但无法弄清楚。请帮忙!
给定的约束:
- 列表中的节点数为 n。
- 1
- -500
- 1
================================================ =================== ==31==错误:AddressSanitizer:在地址 0x602000000098 在 pc 0x000000370bdd bp 0x7ffdce3742a0 sp 上的堆使用后释放 0x7ffdce374298 在 0x602000000098 线程 T0 处读取大小为 8 #2 0x7fe06dce80b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) 0x602000000098 位于 16 字节区域内的 8 个字节 [0x602000000090,0x6020000000a0) 在这里由线程 T0 释放: #3 0x7fe06dce80b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) 先前由线程 T0 在这里分配: #4 0x7fe06dce80b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) 错误地址周围的影子字节: 0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7fd0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c047fff8000: 发发发发发发发发发发发发发发发发发发发发发发发发 => 0x0c047fff8010:fa fa fd [fd]fa fa fd fd fa fa 00 00 fa fa fd fd 0x0c047fff8020: 发发发发发发发发发发发发发发发发发发发发发发发发发发 0x0c047fff8030:发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发上 0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c047fff8050: 发发发发发发发发发发发发发发发发发发 0x0c047fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 影子字节图例(一个影子字节代表 8 个应用程序字节): 可寻址:00 部分可寻址:01 02 03 04 05 06 07 堆左红区:fa 释放的堆区域:fd 堆栈左红区:f1 堆栈中间红区:f2 堆栈右红区:f3 返回后的堆栈:f5 作用域后的堆栈使用:f8 全球红区:f9 全局初始化顺序:f6 被用户中毒:f7 容器溢出:fc 数组 cookie:ac 内部对象红区:bb ASan 内部:fe 左分配红区:ca 右分配红区:cb 阴影间隙:cc ==31==正在中止
单链表的定义。
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode *h=head;
if(left!=right) {
for(int i=1;i<left-1;++i)
{
h=h->next;
}
ListNode *fr=NULL;
ListNode *prev=h;
h=h->next;
for(int j=left;j<=right;++j)
{
fr=h->next;
h->next=prev;
prev=h;
h=fr;
}
head->next->next=prev->next;
head->next=prev;
//h=prev;
return head;
}
else {
return head;
}
}
};
【问题讨论】:
-
写一些简单的本地测试用例并运行,找到最简单的失败的测试用例然后调试。您在这里所做的似乎是使用一些未知大小的数据,遇到错误然后将其转储给其他人以尝试解决。
-
head->next->next=prev->next您正在设置第二个元素的下一个而不考虑值left和right。为什么? (...为什么总是第二个?) -
@dratenik,感谢您的指出。
-
@dratenik,那么在初始化 prev 帮助之后,第三个变量,比如说
ListNode *temp=prev呢?然后temp->next->next=prev->next和temp->next=prev相应地。如果您对此有更好的方法,请告诉我。 -
@JohnZwinck,感谢您的意见!在发布其他问题时,我会记住这一点。
标签: c++ data-structures linked-list runtime-error singly-linked-list