что я должен сделать, чтобы исправить свой код? Ошибка проверки во время выполнения #2 — Стек вокруг переменной » a » был поврежден

#c #arrays #loops #pointers #char

Вопрос:

 #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,7) на cin.getline(a,6), у меня нет проблем, но я не могу найти правильный ответ */

Комментарии:

1. Объявите массив размером 6, разрешите чтение до 7 символов, вероятно, также игнорируя существование нулевого символа.

2. но когда я читаю 6 символов, это может привести к истинным ответам

3. Затем сделайте размер побольше, возможно char a[7];

4. Я понимаю, что это может быть задание со многими глупыми ограничениями, но использование std::string сделало бы это очень простым и гораздо более пуленепробиваемым.

5. спасибо, но я использую только символ, и я могу переписать из строки (если(*спереди==*сзади))

Ответ №1:

Когда объявлен буфер (т. Е. char a[6] ) (или любые переменные, выделенные стеком, если на то пошло), компилятор реализует нечто, называемое файлом cookie стека. Это переменная, которую можно проверить. Вся цель этого-проверить, не случилось ли чего-нибудь неприятного. Код будет делать что-то подобное в конце:

 if(_stack_cookie != ...){
    __stack_chk_fail();
}
 

Это связано с тем, что стек содержит много важной информации, такой как указатель возврата (к какой инструкции следует вернуться, если мы вернемся из функции. Если бы это не было проверено, были бы возможны атаки, разрушающие стек).

Вторая проблема заключается в том, что вы можете читать только 6-1 символы , потому что последний символ будет , из-за форматирования c-строки. Попробуй char a[7] . Также следите за своим кодом палиндрома, так что back = cstr strlen(cstr) - 2