Проблема переполнения буфера при выводе одномерного массива С++

188
19 июня 2022, 17:30

Проблема при переполнении памяти в выводе изменённой матрицы. Задача: По указанию пользователя с положительных четных или отрицательных нечетных элементов матрицы mt (5,6) образовать одномерный массив, элементы которого разместить в прямой последовательности. Также если можете, помогите пожалуйста с заполнением с клавиатуры. Спасибо большое. :)

#include <iostream>
#include <ctime>
using namespace std;
int main() {
    setlocale(LC_ALL, "ru");
    // организация работы рандома
    srand(time(NULL));
    // строки матрицы
    const int m = 5;
    // колонки матрицы
    const int t = 6;
    // инициализация матрицы, sw - выбор операции
    int mt[m][t], sw;
    // индексы динамических массивов
    int a = 0, b = 0;
    // инициализация динамических массивов
    int* W = new int[a];
    int* S = new int[b];
    // заполнение матрицы рандомом
    cout << "Ваша матрица:" << endl;
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < t; j++)
        {
            mt[i][j] = rand() % 100;
            cout << mt[i][j] << " ";
            // cin >> mt[i][j];   - заполнение вручную
        }
        cout << endl;
    }
    // меню выбора операции (2 не выведет, т. к. промежуток от 0 до 100) либо заполняем ручками
    cout << "Выберите операцию:" << endl;
    cout << "1. Создать массив с положительных парных элементов." << endl;
    cout << "2. Создать массив с отрицательных непарных элементов." << endl;
    cin >> sw;
    if (sw == 1) {
        // проход по массиву
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < t; j++)
            {
                // поиск чётных элементов массива больше 0
                if (mt[i][j] % 2 == 0 && mt[i][j] > 0)
                {
                    // заполнение одномерного массива
                    W[a] = mt[i][j];    
                    a++;
                }
            }
        }
        // вывод одномерного массива из парных элементов двумерного
        cout << "Ваш массив положительных чётных элементов:" << "\n";
        for (int i = 0; i < a; i++)
        { 
            cout << W[i] << " ";
        }
        // чистка памяти
        delete[] W;
    }
    if (sw == 2) {
        // проход по массиву
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < t; j++)
            {
                // поиск нечётных элементов массива меньше 0
                if (mt[i][j] % 2 == 1 && mt[i][j] < 0)
                {
                    // заполнение одномерного массива
                    W[b] = mt[i][j];   
                    a++;
                }
            }
        }
        // вывод одномерного массива из непарных элементов двумерного
        cout << "Ваш массив отрицательных нечётных элементов:" << "\n";
        for (int i = 0; i < b; i++)
        {
            cout << S[i] << " ";
        }
    }
}
Answer 1

Посмотрите внимательно на участок

int* W = new int[a];
int* S = new int[b];

У Вас a и b равны нулю, т.е. Вы говорите выделить 0 байт, а дальше идет запись в эти массивы, и само собой записать туда ничего не получается

Самое простое что можно для примера предложить, это выделить массивы размером m*t, тогда Вы будете уверены что массив достаточного размера, что бы вместить все элементы из mt:

int* W = new int[m*t];
int* S = new int[m*t];

PS: 1. Вообще у Вас почему-то в секуции, где sw == 2 запись идет в массив W а выводите массив S. Да и в целом тут одного массива бы хватило, можно не заволить отдельно W и S, если дальше Вам они оба действительно не нужны

  1. Кроме предложенного выше варианта, можно использовать std::vectior и std::list
READ ALSO
Сравнение разности двух вещественных чисел с третьим вещественным числом

Сравнение разности двух вещественных чисел с третьим вещественным числом

У меня есть вещественные числа a, b и сНужно чтобы выполнялось выражение c == (b - a), проблема возникает именно с "равно"

80
как реализовать перегрузку оператора &quot;=&quot; для односвязного списка в c ++?

как реализовать перегрузку оператора "=" для односвязного списка в c ++?

Предыстория: мне нужно реализовать алгоритм быстрой сортировки для односвязного списка

97
Как извлечь usb устройство с помощью WinApi?

Как извлечь usb устройство с помощью WinApi?

Как используя средства WinApi безопасно извлечь телефон или компьютерную мышь из usb порта? Уже пробовал использовать CM_Request_Eject(), удалось извлечь...

110
Как четные столбцы матрицы инициализировать в обратном порядке?

Как четные столбцы матрицы инициализировать в обратном порядке?

Не уверен, что правильно понял ваши пожелания, но все же:

108