У меня две основные проблемы с вашим кодом:
- В этом случае нет необходимости в динамическом выделении c, поскольку size является постоянным значением (и может определяется как constexpr, что лучше).
- вместо использования стандартных контейнеров (таких как std :: array (для массива постоянного размера) или std :: vector (для динамически расширяемого массива)) вы используете plain массив указателей, что не рекомендуется, и в этом случае может вызвать утечку памяти (например, если вы переместите этот код в служебную функцию, так как вы никогда не удаляете память массива num!), вместо этого вы должны использовать std :: unique_ptr! (и лучше прочитайте о RAII идиома ).
- Интервалы и отступы - ваш код должен быть читаем для других кодеров.
О вашем коде, исходный код имеет следующую строку:
cin >> *num
, что означает, что значение в stdin должно быть в ПЕРВОЙ позиции num. В обоих C / C ++ массивы - это просто указатели на первый адрес памяти , выделенный для массива . Чтобы получить доступ к другим элементам, вам нужно использовать оператор [] или указатель arithmeti c с оператором * (например:
cin >> *(num + count)
получит элемент в позиции count ). Кроме того, как указано выше, нет мер безопасности, запрещающих запись в недействительную память, на которую вы можете рассчитывать. Поэтому вы должны использовать контейнеры std, обеспечивающие безопасность индекса.
Просто для справки, вот код I , который был бы написан для получения той же функциональности:
int main() {
constexpr size_t SIZE = 20;
std::array<int, SIZE> arr;
arr.fill(0);
int last_filled_position = 0;
bool cont = true;
while (cont)
{
int val;
char answer;
cout << "ENTER NUMBER:" << std::endl;
cin >> val;
cout<<"TRY AGAIN? Yes/Print/Stop";
cin >> answer;
arr.at(last_filled_position++) = val;
switch (answer)
{
case 'y':
system("cls");
break;
case 'p':
cout << "INPUT HISTORY: " << std::endl;
for (int val: arr) // With more complex types, you should use const auto&
{
cout << val << ", ";
}
cout << endl;
break;
case 's':
cont = false;
cout << "STOPPING";
break;
}
}
return 0;
}