resolut1123
@resolut1123
Студент

C++ WinForm Как правильно вывести массив структур переданный через указатель?

Есть структура:
struct birthday
{
	int year;
	int month;
	int day;
};
struct baseProgr
{
	char surname[30];
	char name[30];
	char sex[10];
	birthday birth;
	char mobile[20];
};

Дальше читаю с файла и т.д
private: auto ch_kol() {
    baseProgr base[max];
    return &base;

private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
		auto *base = ch_kol();
		textBox1->Text = gcnew String(base[ind]->surname);
		textBox2->Text = gcnew String(base[ind]->name);
		textBox3->Text = gcnew String(base[ind]->sex);
		textBox5->Text = gcnew String(base[ind]->mobile);
		cout << "Month = " << base[ind]->birth.month;
		string year = to_string(base[ind]->birth.year);
		string month = to_string(base[ind]->birth.month);
		string day = to_string(base[ind]->birth.day);
		string dat = year + '.' + month + '.' + day;
		textBox4->Text = gcnew String(dat.c_str());
	}

Всё выводит нормально кроме base[ind]->birth.month base[ind]->birth.day base[ind]->birth.year
Вместо этого выводит рандомные числа.
Как исправить?
  • Вопрос задан
  • 75 просмотров
Решения вопроса 2
@res2001
Developer, ex-admin
base[ind].birth.month
Вообще и остальные поля нужно выводить через точку.
Кроме того, если приведенный код ch_kol() - это реально все что есть в функции, то это не верно. Вы в ch_kol возвращаете указатель на локальную переменную, как только отработает return этот указатель станет не действиетльным, т.к. массив base перестанет существовать после выхода из функции.
Подобное определение массива baseProgr base[max];, если max не константа приводит к объявлению массива переменной длины (VLA). Строго говоря С++ не поддерживает VLA, т.к. это фишка Си. Но некоторые компиляторы (gcc) при включенных расширениях (по умолчанию включено) позволяют их использовать. Но этот код становится не переносимым, т.к. при других опциях компилятора или на другом компиляторе код может не собраться.
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, гуглер, экс-олимпиадник.
auto ch_kol() {
    baseProgr base[max];
    return &base;


Вы тут возвращаете адрес локальной переменной. Так делать нельзя. При выходе из функции локальная переменная перестает существовать и у вас указатель на фигню остается.

Переменная должна быть глобальная, частью класса или выделятся через new.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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