• 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.

HackNation - ogólnopolski hackathon
0 głosów
240 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,040 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ź 232 wizyt
pytanie zadane 15 grudnia 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
0 odpowiedzi 118 wizyt
0 głosów
2 odpowiedzi 548 wizyt
pytanie zadane 23 kwietnia 2019 w C i C++ przez mrKaczorrro13 Użytkownik (560 p.)

93,624 zapytań

142,544 odpowiedzi

323,031 komentarzy

63,129 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 968p. - dia-Chann
  2. 959p. - DziarnowskiJ
  3. 941p. - Łukasz Piwowar
  4. 940p. - CC PL
  5. 930p. - Maurycy W
  6. 913p. - Tomasz Bielak
  7. 913p. - Adrian Wieprzkowicz
  8. 906p. - ssynowiec
  9. 899p. - raydeal
  10. 889p. - rucin93
  11. 885p. - Dominik Łempicki (kapitan)
  12. 878p. - Mariusz Fornal
  13. 874p. - robwarsz
  14. 649p. - Michal Drewniak
  15. 632p. - Grzegorz Aleksander Klementowski
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...