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);