如何解决我该怎么做才能修复我的代码?运行时检查失败 #2 - 变量“a”周围的堆栈已损坏
#include <iostream>
bool ispalindrome(char* cstr)
{
char* front = cstr;
char* back = cstr + strlen(cstr) - 1;
while (front < back)
{
if (*front == *back)
{
back--;
front++;
}
else
{
return false;
break;
}
}
return true;
}
using namespace std;
int main()
{
char a[6];
cin.getline(a,7);
cout << ispalindrome(a);
return 0;
}
/* 当我输入时,它发生 / / 运行时检查失败 #2 - 变量“a”周围的堆栈已损坏。 / / 当我通过 cin.getline(a,6) 更改 cin.getline(a,7) 时,它没有问题,但无法得出真正的答案 */
解决方法
当缓冲区(即 char a[6]
)被声明(或任何堆栈分配的变量)时,编译器会实现称为堆栈 cookie 的东西。这是一个可以验证的变量。它的全部目的是检查是否发生了混乱的事情。代码最后会做这样的事情:
if(_stack_cookie != ...){
__stack_chk_fail();
}
这是因为堆栈保存了很多重要的信息,例如返回指针(如果我们从函数返回,要跳回哪个指令。如果不检查这个,可能会发生堆栈粉碎攻击)。
第二个问题是你只能读取 6-1
个字符,因为最后一个字符将是 \0
,由于 c 字符串格式。试试char a[7]
。还要注意回文代码中的 \0
,所以 back = cstr + strlen(cstr) - 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。