Некорректная работа динамического массива (ошибка памяти)

Всем привет!
Придумал для себя задачу с вводом данных в несколько массивов. И вроде бы всё должно работать, но увы и ах! Выводятся какие-то невнятные ошибки с доступом к памяти.

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

int main() {

    setlocale(0, "");
    int num;
    cout << "Создание массива..." << endl << "Введите число учащихся: ";
    cin >> num;
    num = num - 1;
    string* name = new string[num];
    int* age = new int[num];
    int* height = new int[num];
    int* weight = new int[num];

    for (int i = 0; i = num; i++) {

        cout << endl << "Введите имя претендента №" << i << ": ";
        getline(cin, name[i]);
        cout << endl << "Введите возраст претендента №" << i << ": ";
        cin >> age[i];
        cout << endl << "Введите рост претендента №" << i << ": ";
        cin >> height[i];
        cout << endl << "Введите вес претендента №" << i << ": ";
        cin >> weight[i];
    }
    for (int i = 0; i = num; i++) {
        cout << "Имя: " << name[i] << endl;
        cout << "Возраст: " << age[i] << endl;
        cout << "Рост: " << height[i] << endl;
        cout << "Вес: " << weight[i] << endl << endl;
    }

    delete[] name;
    delete[] age;
    delete[] height;
    delete[] weight;

    return 0;
}
num = num - 1;

Не понятно, зачем происходит уменьшение на 1? Хотя, это не важно.

Ошибка в for-цикле: в блоке условия продолжения цикла вы присваиваете счётчику i значение переменной num:

for (int i = 0; i = num; i++)
// ---------------^ ошибка

Из-за этого, в первой же итерации цикла вы пытаетесь записать данные в память за границей массива:

getline(cin, name[i]);

А для того, чтобы из консоли корректно считывалась строка в элемент массива name[i], необходимо в цикле первым делом вызвать

cin.getline();

, чтобы отбросить из потока ввода символ новой строки, который попал в поток при получении

cin >> num;

Работающий код:

#include <iostream>
#include <string>
using namespace std;

int main() {
    setlocale(0, "");

    int num;

    cout << "Создание массива..." << endl << "Введите число учащихся: ";
    cin >> num;

    num = num - 1;

    string* name = new string[num];
    int* age = new int[num];
    int* height = new int[num];
    int* weight = new int[num];

    for (int i = 0; i < num; i++) {

        cout << endl << "Введите имя претендента №" << i << ": ";
        cin.ignore();
        getline(cin, name[i]);

        cout << endl << "Введите возраст претендента №" << i << ": ";
        cin >> age[i];

        cout << endl << "Введите рост претендента №" << i << ": ";
        cin >> height[i];

        cout << endl << "Введите вес претендента №" << i << ": ";
        cin >> weight[i];
    }

    for (int i = 0; i < num; i++) {
        cout << "Имя: " << name[i] << endl;
        cout << "Возраст: " << age[i] << endl;
        cout << "Рост: " << height[i] << endl;
        cout << "Вес: " << weight[i] << endl << endl;
    }

    delete[] name;
    delete[] age;
    delete[] height;
    delete[] weight;

    return 0;
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.