При запуске программы C++ возвращает число -1073741819

Рейтинг: 0Ответов: 1Опубликовано: 21.05.2023

Ошыбка: Вызвано исключение по адресу 0x00007FF9B3EB7A20 (ucrtbased.dll) в Find Pass.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF.

Код:

#include <string>
#include <fstream>
#include <cmath>
using namespace std;

int main()
{
    int l, i;
    int step = 0;
    cout << "Lenght:";
    cin >> l;
    cout << endl;
    string PassV = "";
    const char* AllSymb[] = { "Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","J","I","H","G","F","E","D","C","B","A","z","y","x","w","v","u","t","s","r","q","p","o","n","m","l","k","j","i","h","g","f","e","d","c","b","a","!","#","$","&","(",")","*","+",",","-",".","/",":",";","<",">","=","@","?","[","]","\\","^","_","`","{","}","|","~" };
    int IndArr[15] = {};
    int l_Arr = sizeof(AllSymb) / sizeof(*AllSymb);
    for (i = 0; i <= l-1; i++) { IndArr[i] = 0; }
    while (step != pow(l_Arr , l)) {
        for (i = 0; i <= l_Arr; i++)
        {
            PassV = "";
            for (i = 0; i <= l-1; i++)
            {
                PassV += AllSymb[IndArr[i]];
            }
            IndArr[0] += 1;
            cout << PassV << endl;
            step += 1;
        }
        for (i = 0; i <= l-1; i++)
        {
            if (l_Arr == IndArr[i]) {
                IndArr[i + 1] += 1;
                IndArr[i] = 0;
            }
        }
    }
    return 0;
}

Код должен быстро перебирать возможные варианты паролей из символов данных в массиве AllSymb. Количество символов задается пользователем.

Ответы

▲ 2Принят

Добавляем маленькую отладочную строку...

for (i = 0; i <= l-1; i++)
{
    assert(IndArr[i] <= l_Arr);
    PassV += AllSymb[IndArr[i]];
}

и программа вылетает с сообщением о том, что это условие не выполнено, т.е. что вы вышли за пределы массива.

Дальше рассказывать или уже понятно?...

Можно написать вместо assert более подробный вывод:

if (IndArr[i] > l_Arr)
{
    cout << "i = " << i << "; IndArr[i] = " << IndArr[i] << endl;
    return 0;
}

и получить

i = 0; IndArr[i] = 82

Теперь, думаю, все уже очевидно...