报错情况
在重刷234.回文链表时,写了如下代码,
class Solution {
public:
bool isPalindrome(ListNode* head) {
// 回文分为奇回文和偶回文
// 无论是字符串,还是数组,要判断回文,首先得确定它的长度
int len = 0;
ListNode* p = head;
while(p != nullptr){
++ len;
p = p -> next;
}
// 栈判断回文
stack<int> stk;
p = head;
int cnt = 0;
while(p != nullptr){
++ cnt;
if(cnt == len / 2) break;
stk.push(p -> val);
p = p -> next;
}
if(len % 2 == 1) p = p -> next;
// cout << "stk size is : " << stk.size() << ",cnt = : " << cnt <<endl;
while(p != nullptr){
if(stk.top() != p -> val) return false;
p = p -> next;
stk.pop();
}
return true;
}
};
在测试用例为
[1,2]
报错信息如下:
Line 172: Char 16: runtime error: reference binding to misaligned address 0xbebebebebebec0ba for type 'int', which requires 4 byte alignment (stl_deque.h)
0xbebebebebebec0ba: note: pointer points here
<memory cannot be printed>
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/stl_deque.h:181:16
错误定位
通过注释代码的方法,问题出现在这一句代码上:
if(stk.top() != p -> val) return false;
错误解决
虽然定位到了错误位置,但我仍然没有想通是哪方面的问题。经过网上查询相关的错误信息,发现当栈为空,且访问栈顶元素会报该错误信息。之所以出现该错误,原因在于我的代码逻辑不正确。
为解决该错误,我对代码逻辑进行了修改,将 if(cnt == len / 2) break;
改为 if(cnt > len / 2) break;
。