@antonowano
Профессиональный самоучка

Причина бесконечного вывода несвязанных символов?

Только начал изучение C++
Компиляция проходит без ошибок, при выполнении exe в консоль идут бесконечное кол-во несвязанных символов со звуком предупреждения Windows:

#include <iostream>
#include <cstdlib>

using namespace std;

string *addressSearch(int count)
{
	string name;
	string *address[count];
	
	for (int i = 0; i < count; i++) {
		cout << "Напишите точное название " << (i + 1) << " хар-ки: ";
		cin >> name;
		address[i] = &name; // TODO: написать функция поиска ячейки памяти по значению переменной name
	}
	
	return *address;
}

int main()
{
	int count;
	
	setlocale(0, "");
	cout << "Стадия 1. Поиск ячеек памяти с необходимыми хар-ми" << endl;
	cout << "Максимальное количество характеристик: "; 
	cin >> count;
	
	cout << "Для начала выполните первое обновление камня" << endl;
	system("pause");
	
	string *address = addressSearch(count);
	
	cout << "Первая: " << address[0] << endl;
	
    return 0;
}
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
Причин много:
1.В функции addressSearch в цикле ты читаешь в name ввод пользователя в цикле, затем присваиваешь адрес name в массив. Тут ошибка в том, что name у тебя все время одна и та же переменная и весь массив у тебя будет заполнен одним и тем же значением - адресом name. На каждой итерации цикла после ввода, name будет иметь свое значение, но в следующей итерации это значение затрется следующим вводом. Таким образом в address на выходе из функции ты будешь иметь в каждом элементе адрес name, который ссылается на один и тот же объект, содержащий последний ввод пользователя.

2.В функции addressSearch переменные name и address объявлены как локальные, после выхода из функции этих переменных уже не существует, а ты возвращаешь из функции адрес не существующей переменной. Поэтому и бардак в выводе.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
Неправильная работа с указателями - cout не может найти окончание строки, и выводит кучу мусора из памяти. Почему то мне кажется что return *address; надо заменить на return address; но я могу ошибаться.
Ответ написан
Nipheris
@Nipheris Куратор тега C++
У вас полнейший ад в плане работы с памятью. Вообще непонятно зачем эта свистопляска с указателем на string и массивом, непонятно даже что вы хотите вернуть из функции поиска - указатель на string или на массив string. Так или иначе, и то и другое - локальные переменные, и пытаться работать с указателями на них после завершения работы функции - грубая ошибка (точнее, ошибка пытаться возвращать указатель на локальную переменную из фукнции и думать, что это будет работать).
Укажите, что вы хотите сделать, т.к. сложно даже понять решаемую задачу (видимо, что-то где-то найти?).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы