微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我该怎么做才能修复我的代码?运行时检查失败 #2 - 变量“a”周围的堆栈已损坏

如何解决我该怎么做才能修复我的代码?运行时检查失败 #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 举报,一经查实,本站将立刻删除。