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

gdzie tkwi błąd w programie? (dynamiczna pamięć dla tablicy i jej odczyt)

Object Storage Arubacloud
0 głosów
444 wizyt
pytanie zadane 22 maja 2021 w C i C++ przez Arek Kowalski Początkujący (450 p.)

Witam 

Chciałem napisać program, który za pomocą dynamicznie stworzonej tablicy pozwoli zapisać z klawiatury jakieś dane a potem poprzez wskaźnik pozwoli wpisane wartości odczytać, niestety finalnie dane z komórek tablicy zwracane są błędnie (podawane są inne dane) - pomocy, gdzie strzeliłem bug'a?

# include <iostream>

using namespace std;

int main(){

    
    int ile, set, k;
    cout << "podaj ile liczb w tablicy: " << endl;
    cin >> ile;
    int var = ile;

    int *tablica;
    tablica = new int [ile];
    

    for ( int i =0 ; i < ile ; i++){
        cout << "podaj wartosc komorki tablicy [" << i << "]"<< endl; 
        cin >> set;
        *tablica = set;
        tablica++;
    }
    
    cout << "podales dane: " << endl;
   

    for (k = 0 ; k < var ; ++k){
        
        cout << k+1 << " tablica ["<< k <<"] = " <<tablica[k]<<endl; 
       
    }

    delete [] tablica;
    return 0;
}

 

1 odpowiedź

+3 głosów
odpowiedź 22 maja 2021 przez tkz Nałogowiec (42,000 p.)

Linia 20. i 21. do usunięcia, nie możesz inkrementować całego wskaźnika. 

*(tablica+i) = set;

 

komentarz 23 maja 2021 przez Arek Kowalski Początkujący (450 p.)
edycja 23 maja 2021 przez Arek Kowalski

dzięki - w sumie teraz działa ale nadal czegoś nie ogarniam ?

Dlaczego nie mogę inkrementować wskaźnika kiedy np. przy odczycie (po dodatkowej zmianie w programie zastosowałem inkrementację i działa <poniżej fragment działającego kodu>

for (k = 0 ; k < var ; ++k){
        
        cout << k+1 << " tablica ["<< k <<"] = " << * tablica <<endl; 
        tablica++;
       
    }

i jeszcze jeden fragment z kursu P. Zelenta (odcinek 10). ok 18:40 autor podaje przykład implementacji danej do szufladki tablicy a następnie inkrementacji szufladki właśnie w taki sposób jak chciałem na początku ale mi nie działało. Jak to wyjaśnić? Tam była inkrementacja całego wskaźnika 

1
komentarz 23 maja 2021 przez Oscar Nałogowiec (29,290 p.)
edycja 23 maja 2021 przez Oscar

Wskaźniki wolno inkrementować, ale trzeba być świadomym faktu, że taka operacja zmienia wartość wskaźnika i konsekwencji tej zmiany. To już dalej nie jest ta sama wartość wskaźnika co na początku. A ty potem indeksujesz tym zmienionym wskaźnikiem tablicę jakby on dalej wskazywał na jej początek. I jeszcze w szczególności delete musi dostać taką samą wartość wskaźnika, jaką zwrócił new.

Na tym screendumpie jest po prostu wyciek pamięci - nie jest zwolniona. No i jeszcze zła kolejność inicjowania zmiennych. Ten kod jest błędny. Ale są ślady poprawnego podejścia - mamy dwa wskaźniki - jednym (wskaznik) się bawimy, ale drugi (tablica) cały czas przechowuje oryginalną wartość, zwróconą przez new. Nigdy nie należy zmieniać ani zapominać tego co zwraca new.

 

Podobne pytania

0 głosów
1 odpowiedź 131 wizyt
pytanie zadane 8 czerwca 2020 w PHP przez patryk241 Użytkownik (700 p.)
0 głosów
2 odpowiedzi 881 wizyt
pytanie zadane 3 lipca 2018 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 180 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez szachovy Początkujący (270 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...