Dynamiczna tablica struktur

0

Cześć wszystkim!

Ostatnio czytałem trochę o strukturach i wskaźnikach, podjałem się napisania prostego programu zawierającego dynamiczną tablicę struktur i powstało coś takiego
Fragment kodu:


struct Batonik{
string nazwa;
double waga;
int kalorie;
};

Batonik * wsk = new Batonik[2];
for (int i = 0; i<2; i++){
 cout<<"Podaj nazwe batonika: ";
 getline(cin, wsk[i].nazwa);
 cout<<"Podaj wage batonika: ";
 (cin>>wsk[i].waga).get();
 cout<<"Podaj liczbe kalorii: ";
 (cin>>wsk[i].kalorie).get();
 cout<<endl;
}

Chciałbym jakoś poukładać sobie wiedzę na ten temat ale do tego muszę rozwiać swoje wątpliwości.

  1. Czy przedstawiony wyżej fragment kodu można w ogóle nazwać DYNAMICZNĄ tablicą strutkur? Jeśli nie to, gdzie popełniłem błąd?
  2. W książce, którą aktualnie przerabiam związaną z C++ napisane jest, że sięganie do pól(wskaźników) odbywa się za pomocą operatora -> i błędem jest użycie operatora kropki (jak przy normalnych strukturach). W moim kodzie w przypadku użycia operatora -> program nawet się nie kompiluje - działą tylko i wyłącznie z operatorem kropki - czemu?
  3. (chyba najgłupsze pytanie) Czy jeśli najpierw w miejscu wsk[0].waga zapisze wartosc powiedzmy 100, to po zwolnieniu pamieci (delete [] wsk;) odwolani wsk[0].waga nadal powinno wyswietlac wartość 100 zamiast wyrzucania błedu?
cout<<wsk[0].waga;
delete [] wsk;
cout<<endl;
cout<<wsk[0].waga;

Z góry dziękuje za odpowiedz na moje pytania. Pozdrawiam :-)

3
  1. Jest to tablica dynamiczna ,więc chyba tak.
  2. Wydaje mi się, że tab[n] zwraca już obiekt, a nie adres, więc musisz używać kropki.
  3. Po usunięciu wskaźnika nie wiesz co się pod nim znajduje, więc nie możesz się odwołać do tego obszaru pamięci.

Proszę o sprostowanie bo w sumie tak to pamiętam, ale mogę się mylić.

4
  1. Tak, chociaż przy wielkości zapisanej na stałe wiele dynamizmu nie ma. Jeśli mówimy o wskaźnikach, to nie powinieneś ich jawnie używać: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/
  2. W tym przypadku tab[n] jest równoznaczne z *(tab+n). Ze strzałką mógłbyś użyć (tab+n)->waga.
  3. Dostęp po usunięciu to UB, może zdarzyć się wszystko.
  4. Po co get() na strumieniu?
2

a->b to dokładnie to samo co (*a).b

0

Dziękuje wszystkim za odpowiedzi :-)

kq napisał(a):
  1. Tak, chociaż przy wielkości zapisanej na stałe wiele dynamizmu nie ma. Jeśli mówimy o wskaźnikach, to nie powinieneś ich jawnie używać: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/
  2. W tym przypadku tab[n] jest równoznaczne z *(tab+n). Ze strzałką mógłbyś użyć (tab+n)->waga.
  3. Dostęp po usunięciu to UB, może zdarzyć się wszystko.
  4. Po co get() na strumieniu?

1​. Dzięki za podrzucenie tej strony/artykułu przyda się z pewnością dla początkującego.
3​. Czyli to ze w tym przypadku gdy po usunieciu mojej talbicy (delete [] wsk;) wartosc wyswietalna to nadal 100 to zwykly przypadek, prawda?
4​. Chyba dla "bezpieczeństwa"

0

3​. Generalnie tak, w praktyce po prostu nie nadpisuje się zbędnie zwolnionej pamięci, a na razie nic innego w programie jej nie potrzebowało i nie nadpisało. W dłużej działającym programie zauważyłbyś, że później pod tym wskaźnikiem miałbyś "losowe" wartości.
4​. Nie widzę sensu, można śmiało wywalić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1