C/C++

Некорректно работает написанная программа

Доброго всем времени суток! Написал небольшую программу, в которой реализованы динамические массивы, хранящие в себе имя и возраст человека, эти данные вводит пользователь. Затем зациклил этот процесс, чтобы программа могла хранить и отображать данные желаемого количества людей. Но во время работы программа крашится после отработки первого цикла. Пробовал запускать её без массива строк, отвечающего за имена и всё работало нормально, но как только возвращаю его, программа опять падает.

Что не так с его реализацией, почему из-за динамического массива строк при работе программа выдаёт ошибку и как это можно исправить? Заранее спасибо за помощь.

Вот исходный код:

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

int main()
{
setlocale(LC_ALL, "ru");

string name;
int age;
int choice;
int size = 1;

string* NameArray = new string[size];
int* AgeArray = new int[size];

for (int i = 0; i < size; i++)
{
cout << "Введите имя: ";
cin >> name;
cout << endl;

cout << "Введите возраст: ";
cin >> age;
cout << endl;

NameArray[i] = name;
AgeArray[i] = age;
size++;

for (int j = 0; j < (size-1); j++)
{
cout << i<< " элемент структуры объекта Р: "<< NameArray[i] <<" "<< AgeArray[i] << ";" << endl;
}

cout<<endl << "Внести еще данные — 1, выход — 0: ";
cin >> choice;
cout << endl;
if (choice == 1)
{
continue;
}
else
{
break;
}
}
delete[] NameArray;
delete[] AgeArray;
}
K A I R A
K A I R A
410
У тебя массивы NameArray и AgeArray состоят из ОДНОГО элемента каждый - именно такое значение имеет переменная size в момент выполнения new. При попытке записать второе значение запись производится за пределами массива и программы вылетает.

От того, что ты увеличиваешь значение переменной size, размер массива НЕ МЕНЯЕТСЯ. Ты выделил участок памяти ФИКСИРОВАННОГО размера операцией new и всё, что ты с ним можешь после этого сделать (кроме чтения/записи) - освободить его. Изменить размер участка памяти, выделенного new, ты НЕ МОЖЕШЬ.

Хочешь изменить размер массива - создай НОВЫЙ массив и скопируй в него значения старого. А лучше - используй встроенный в C++ тип std::vector.

И зачем использовать два массива, когда удобнее использовать один массив структур из двух полей?
Самат Биликеев
Самат Биликеев
53 660
Лучший ответ
K A I R A Векторы пока ещё не изучал, поэтому работал без них. Спасибо за замечания, обязательно всё учту и исправлю!
Так как динамический массив расположен за пределами стека, а программа фактически владеет только указателем на ту область, мы никак не можем определить или проверить сколько же там наших элементов. Поэтому после создания такого массива нам нужно запомнить, сколько там элементов, создав дополнительную переменную size. Это своеобразный ограничитель, который говорит всем нашим циклам, чтобы не выходили за за границы очерченной области.
К примеру у вас 100 га пустого поля и вы даете задание трактористу вспахать его. Если не задать ему рамки, в которых он может двигаться, он может заехать на уже засеянное поле соседа и возникнет конфликт. Поэтому вы даете ему указатель на поле, и сообщаете ему его размер.
Если вы сообщите ему больший размер, поле от этого больше не станет, верно? Но он уедет за границы участка. И сам тракторист по полю никак не может определить, куда ему можно а куда нет. Это же не гараж с номерами. В том числе и вы если потеряете документы, где обозначены размеры - не сможете. Вот это и есть переменная size.
(Кстати из этого следует, что вы можете указывать трактористу МЕНЬШИЙ размер, чем все поле, если у вас не хватает пшеницы чтобы засеять все поле, а по ходу прибыли вы можете задавать все больший размер, пока не засеете все целиком.
Из этого вытекает хитрость - вы можете выделить для массива область с запасом, а переменной size манипулировать в пределах этого запаса.)
Manu Friend
Manu Friend
51 416