GrhuGhu Temat założony przez niniejszego użytkownika |
Problem z new i delete(C++) » 2016-06-30 11:13:40 Witam. Jestem początkującym programistą i niedawno zacząłem bawić się wskaźnikami. #include <iostream> using namespace std; int ile;
int main() { cin >> ile; int * wsk; wsk = new int[ ile ]; for( int i = 0; i < ile; i++ ) { cout <<( int ) wsk << endl; wsk++; } delete[] wsk; return 0; }
. Napisałem taki prosty kod, który miał przyjąć jakąś liczbę, a następnie utworzyć tablice o takiej "pojemności" po czym wyświetlić adres w pamięci każdej zmiennej z tej tablicy. I tu się pojawia problem, bo gdy wprowadzę do programu jakąkolwiek liczbę (Z wyjątkiem 10 i 20, oraz taką, która mieściła by się w zmiennej typu int :P ) to program działa bez zarzutów, a kiedy zostanie wprowadzona liczba 10 lub 20, program utworzy te zmienne, wyświetli ich adres po czym wyskoczy komunikat informujący o tym, że owy program przestał działać. Ktoś wie czym to jest spowodowane lub co robię źle? |
|
darko202 |
» 2016-06-30 12:02:26 0. dziwne rzeczy opisujesz :-), pewnie to niezdefiniowane zachowanie po tym co robisz. 1. musisz jeszcze raz zastanowić się co robisz ! wsk = new int[ ile ]; ... wsk++; ...
na co wskazuje "wsk" po wyjściu z pętli czy jest to początek tablicy ? tzn. to co było w wsk = new .... czy jesteś już poza tablicą ? zwalniasz wówczas co ? 2. * utwórz nowy wskaźnik * przypisz mu wartość początkowa tablicy * zastosuj na nim ++ zapamiętaj dlaczego tak :-) |
|
mateczek |
» 2016-06-30 12:23:25 albo for( int i = 0; i < ile; i++ ) { cout <<( int ) wsk << endl; wsk[ i ]; } |
|
michal11 |
» 2016-06-30 12:29:37 @up
twój kod wypisze ile-razy pierwszy element tablicy. |
|
Monika90 |
» 2016-06-30 12:32:06 cout <<( int ) wsk << endl;
|
To też jest źle, jeżeli już to tak: cout << reinterpret_cast < std::uintptr_t >( wsk ) << endl;
tylko trzeba dodać #include <cstdint> |
|
GrhuGhu Temat założony przez niniejszego użytkownika |
» 2016-06-30 12:39:54 #include <iostream>
using namespace std;
int ile;
int main() { cin >> ile; int * wsk; wsk = new int[ ile ]; for( int i = 0; i < ile; i++ ) { cout <<( int ) wsk << endl; wsk++; } wsk -= ile; delete[] wsk; return 0; }
Teraz dobrze? :) Jestem jeszcze początkujący, dziś dopiero zacząłem przerabiać wskaźniki, wciąż nie do końca rozumiem jak działają jednak powoli zaczynam łapać. Oglądam video kursy do c++ i kod prezentowany na filmie był dokładnie taki sam jak mój, dodatkowo działał bezbłędnie, początkowo jedyne rozwiązanie jakie udało mi się wymyślić to umieszczenie "i<=ile" zamiast "i<ile" w warunku pętli, mimo iż program nie wysypywał się to działał błędnie, bo wyświetlany był o jeden więcej adres niż został o to "poproszony". Po pewnym czasie zacząłem dochodzić do wniosku, że może nalezy wprowadzić linijkę "wsk -= ile;". W każdym razie dziękuje za pomoc. :) |
|
Monika90 |
» 2016-06-30 13:08:59 To też nie jest dobrze. Po prostu nie zmieniaj wartości wskaźnika wsk, to nie będziesz musiał go potem korygować. To jest niepotrzebna komplikacja, i łatwo popełnić błąd. Oglądam video kursy do c++ i kod prezentowany na filmie był dokładnie taki sam jak mój, dodatkowo działał bezbłędnie
|
Zelent miał szczęście i jego błędny kod przez przypadek działał zgodnie z jego błędnymi wyobrażeniami na temat C++. |
|
GrhuGhu Temat założony przez niniejszego użytkownika |
» 2016-06-30 13:27:22 cout << reinterpret_cast < std::uintptr_t >( wsk ) << endl;
Próbowałem dodać ową linijkę (A raczej podmienić "cout << (int)wsk << endl;) niestety kompilator pokazuje jakiś błąd. (Z góry uprzedzam, że dodałem biblioteke <cstdint>). A co do wskaźnika, to czy skorygowanie go w ten sposób sprawi, że wróci on na swoje miejsce? (Lub przynajmniej o tyle miejsc ile wskazuje zmienna "ile") Jestem tylko ciekaw :) |
|
« 1 » 2 |