• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przy wpisywaniu danych do tabeli program wysypuje sie.

42 Warsaw Coding Academy
0 głosów
171 wizyt
pytanie zadane 10 stycznia 2020 w C i C++ przez MaTiDxxx Początkujący (290 p.)
#include <iostream>
#include <cstdlib>
#include <string>


using namespace std;


struct DataUrodzenia
{
	int rok;
	int miesiac;
	int dzien;	
};


struct Osoba 
{
	string imie;
	string nazwisko;
	string adres;
	DataUrodzenia *dataurodzenia;
};


int main()
{

int N;
Osoba *Dane[N];

for (int i=0; i<N; i++)
{
Dane[i] = (struct Osoba*) malloc ( N * sizeof(struct Osoba));
}

cout << "Podaj liczbe N" << endl;
cin >> N;	

for (int i=0; i<N; i++)
{
	cout << "Podaj imie" << endl;
	cin >> Dane[i]->imie;
	cout << "Podaj nazwisko" << endl;
	cin >> Dane[i]->nazwisko;
	cout << "Podaj adres" << endl;
	cin >> Dane[i]->adres; 
}

for (int i=0; i<N; i++)
{
	cout << Dane[i]->imie;
	cout << Dane[i]->nazwisko;
	cout << Dane[i]->adres;
}


return 0;
}

Witam, główny problem polega na Tym, iż przy wpisywaniu imienia do tabeli program sie konczy. Zakladam, że jest to jakis problem z przydzieleniem pamieci. Prosze o pomoc i pozdrawiam :) 

komentarz 10 stycznia 2020 przez tkz Nałogowiec (42,020 p.)
Dlaczego używasz malloca? Gdzie zwalniasz pamięć? Sama alokacja struktur to błąd. Może kiedyś pisałeś w C, ale C++ nie powinien tego przepuścić.

1 odpowiedź

+1 głos
odpowiedź 10 stycznia 2020 przez Radfler VIP (101,030 p.)
edycja 10 stycznia 2020 przez Radfler

Problem jest z tym fragmentem:

int N;
Osoba *Dane[N]; // UB
 
for (int i=0; i<N; i++)
{
Dane[i] = (struct Osoba*) malloc ( N * sizeof(struct Osoba)); // później powoduje to UB
}
 
cout << "Podaj liczbe N" << endl;
cin >> N; 

Tworzysz statyczną tablicę wskaźników na `Osoba` z użyciem niezainicjowanej niestałej zmiennej `n` co powoduje niezidentyfikowane zachowanie. Ponadto korzystasz z dynamicznej alokacji z języka C do stworzenia obiektów nietrywialnej klasy, a następnie korzystasz z tych obiektów bez ich utworzenia. To wszystko powoduje, że twój program jest niezdefiniowany (nie wiadomo właściwie co się stanie).

Proponuję rozwiązanie korzystające z C++owego operatora new[]:

cout << "Podaj liczbe N" << endl;
int N; // lepiej użyć `std::size_t`
cin >> N; 
 
Osoba* Dane = new Osoba[N];
// dodatkowo trzeba będzie zmienić strzałki `->` na kropki `.`
// oraz usunąć tablicę operatorem delete[]

// lepiej użyć `std::vector<Osoba>` lub `std::unique_ptr<Osoba[]>`:
// std::vector<Osoba> Dane(N);
// auto Dane = std::make_unique<Osoba[]>(N);

 

1
komentarz 10 stycznia 2020 przez MaTiDxxx Początkujący (290 p.)
Dziękuje bardzo, faktycznie problemem była funkcja malloc.

Pozdrawiam i życzę miłego wieczoru.

Podobne pytania

0 głosów
1 odpowiedź 189 wizyt
pytanie zadane 15 grudnia 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
0 odpowiedzi 92 wizyt
0 głosów
2 odpowiedzi 400 wizyt
pytanie zadane 23 kwietnia 2019 w C i C++ przez mrKaczorrro13 Użytkownik (560 p.)

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...