Dynamiczna tablica struktur

Dynamiczna tablica struktur
W1
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:22
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:

Kopiuj

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?
Kopiuj
cout<<wsk[0].waga;
delete [] wsk;
cout<<endl;
cout<<wsk[0].waga;

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

edytowany 1x, ostatnio: flowCRANE
mic1996
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 2 lata
  • Postów:52
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ć.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
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?

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
2

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

hauleth
W C, w C++ niekoniecznie.
W1
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:22
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"

edytowany 2x, ostatnio: kq
kq
Zedytowałem, bo markdown automatycznie robi swoją numerację.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Szczecin
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ć.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.