Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

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

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

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

#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;
}
Лучший ответ
Андрей Высший разум (428543) 1 год назад
У тебя массивы NameArray и AgeArray состоят из ОДНОГО элемента каждый - именно такое значение имеет переменная size в момент выполнения new. При попытке записать второе значение запись производится за пределами массива и программы вылетает.

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

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

И зачем использовать два массива, когда удобнее использовать один массив структур из двух полей?
Никита КупцовЗнаток (436) 1 год назад
Векторы пока ещё не изучал, поэтому работал без них. Спасибо за замечания, обязательно всё учту и исправлю!
Остальные ответы
Сергей Гений (56733) 1 год назад
Так как динамический массив расположен за пределами стека, а программа фактически владеет только указателем на ту область, мы никак не можем определить или проверить сколько же там наших элементов. Поэтому после создания такого массива нам нужно запомнить, сколько там элементов, создав дополнительную переменную size. Это своеобразный ограничитель, который говорит всем нашим циклам, чтобы не выходили за за границы очерченной области.
К примеру у вас 100 га пустого поля и вы даете задание трактористу вспахать его. Если не задать ему рамки, в которых он может двигаться, он может заехать на уже засеянное поле соседа и возникнет конфликт. Поэтому вы даете ему указатель на поле, и сообщаете ему его размер.
Если вы сообщите ему больший размер, поле от этого больше не станет, верно? Но он уедет за границы участка. И сам тракторист по полю никак не может определить, куда ему можно а куда нет. Это же не гараж с номерами. В том числе и вы если потеряете документы, где обозначены размеры - не сможете. Вот это и есть переменная size.
(Кстати из этого следует, что вы можете указывать трактористу МЕНЬШИЙ размер, чем все поле, если у вас не хватает пшеницы чтобы засеять все поле, а по ходу прибыли вы можете задавать все больший размер, пока не засеете все целиком.
Из этого вытекает хитрость - вы можете выделить для массива область с запасом, а переменной size манипулировать в пределах этого запаса.)
Похожие вопросы