Доброго всем времени суток! Написал небольшую программу, в которой реализованы динамические массивы, хранящие в себе имя и возраст человека, эти данные вводит пользователь. Затем зациклил этот процесс, чтобы программа могла хранить и отображать данные желаемого количества людей. Но во время работы программа крашится после отработки первого цикла. Пробовал запускать её без массива строк, отвечающего за имена и всё работало нормально, но как только возвращаю его, программа опять падает.
Что не так с его реализацией, почему из-за динамического массива строк при работе программа выдаёт ошибку и как это можно исправить? Заранее спасибо за помощь.
Вот исходный код:
#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;
}
C/C++
Некорректно работает написанная программа
У тебя массивы NameArray и AgeArray состоят из ОДНОГО элемента каждый - именно такое значение имеет переменная size в момент выполнения new. При попытке записать второе значение запись производится за пределами массива и программы вылетает.
От того, что ты увеличиваешь значение переменной size, размер массива НЕ МЕНЯЕТСЯ. Ты выделил участок памяти ФИКСИРОВАННОГО размера операцией new и всё, что ты с ним можешь после этого сделать (кроме чтения/записи) - освободить его. Изменить размер участка памяти, выделенного new, ты НЕ МОЖЕШЬ.
Хочешь изменить размер массива - создай НОВЫЙ массив и скопируй в него значения старого. А лучше - используй встроенный в C++ тип std::vector.
И зачем использовать два массива, когда удобнее использовать один массив структур из двух полей?
От того, что ты увеличиваешь значение переменной size, размер массива НЕ МЕНЯЕТСЯ. Ты выделил участок памяти ФИКСИРОВАННОГО размера операцией new и всё, что ты с ним можешь после этого сделать (кроме чтения/записи) - освободить его. Изменить размер участка памяти, выделенного new, ты НЕ МОЖЕШЬ.
Хочешь изменить размер массива - создай НОВЫЙ массив и скопируй в него значения старого. А лучше - используй встроенный в C++ тип std::vector.
И зачем использовать два массива, когда удобнее использовать один массив структур из двух полей?
K A I R A
Векторы пока ещё не изучал, поэтому работал без них. Спасибо за замечания, обязательно всё учту и исправлю!
Так как динамический массив расположен за пределами стека, а программа фактически владеет только указателем на ту область, мы никак не можем определить или проверить сколько же там наших элементов. Поэтому после создания такого массива нам нужно запомнить, сколько там элементов, создав дополнительную переменную size. Это своеобразный ограничитель, который говорит всем нашим циклам, чтобы не выходили за за границы очерченной области.
К примеру у вас 100 га пустого поля и вы даете задание трактористу вспахать его. Если не задать ему рамки, в которых он может двигаться, он может заехать на уже засеянное поле соседа и возникнет конфликт. Поэтому вы даете ему указатель на поле, и сообщаете ему его размер.
Если вы сообщите ему больший размер, поле от этого больше не станет, верно? Но он уедет за границы участка. И сам тракторист по полю никак не может определить, куда ему можно а куда нет. Это же не гараж с номерами. В том числе и вы если потеряете документы, где обозначены размеры - не сможете. Вот это и есть переменная size.
(Кстати из этого следует, что вы можете указывать трактористу МЕНЬШИЙ размер, чем все поле, если у вас не хватает пшеницы чтобы засеять все поле, а по ходу прибыли вы можете задавать все больший размер, пока не засеете все целиком.
Из этого вытекает хитрость - вы можете выделить для массива область с запасом, а переменной size манипулировать в пределах этого запаса.)
К примеру у вас 100 га пустого поля и вы даете задание трактористу вспахать его. Если не задать ему рамки, в которых он может двигаться, он может заехать на уже засеянное поле соседа и возникнет конфликт. Поэтому вы даете ему указатель на поле, и сообщаете ему его размер.
Если вы сообщите ему больший размер, поле от этого больше не станет, верно? Но он уедет за границы участка. И сам тракторист по полю никак не может определить, куда ему можно а куда нет. Это же не гараж с номерами. В том числе и вы если потеряете документы, где обозначены размеры - не сможете. Вот это и есть переменная size.
(Кстати из этого следует, что вы можете указывать трактористу МЕНЬШИЙ размер, чем все поле, если у вас не хватает пшеницы чтобы засеять все поле, а по ходу прибыли вы можете задавать все больший размер, пока не засеете все целиком.
Из этого вытекает хитрость - вы можете выделить для массива область с запасом, а переменной size манипулировать в пределах этого запаса.)
Похожие вопросы
- Программа на c++ не работает. Написать структуру и прочее. Подскажите, пожалуйста, что я делаю не так.
- Написать программу на языке Си
- Написать программы на СИ
- Помогите написать программу на С++
- Написать программу в С++ (нахождение площади трапеции)
- В LINUX OS Написать программу, которая из командной строки получает целое число N и некоторый текст “Text”.
- Помогите написать программу на С
- Помогите написать программу на C++
- Помогите написать программу на с++
- Помогите написать программу на с++