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

Podstawy - wksaźniki. Linux Ubuntu

Object Storage Arubacloud
0 głosów
599 wizyt
pytanie zadane 12 lutego 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)

Witam,

Zmagam się z pewnym problemem w Linux Ubuntu w aplikacji Xterm.

#include <iostream>

using namespace std;
int ile;

int main()
{
    cout << "Podaj rozmiar tablicy: ";



    cin >> ile;

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

    for(int i=0; i<ile; i++)
    {
        cout << reinterpret_cast<int >(tablica[ile]) << "\n";

        tablica++;
    }

    delete [] tablica;

    return 0;
}

Przerabiam 10 odcinek kursu Pana Mirka, natomiast po wpisaniu dokładnie tego samego kodu, nie mogłem go skompilować, znalazłem podobny temat gdzie wytłumaczono, iż aby zamienić int* na int trzeba użyć reinterpret <int >(adres), zastosowałem takie polecenie i kompilator się uruchomił. Dalszy problem polega na tym, że gdy wpisuję rozmiar tablicy np 10 wyświetla mi tylko pierwszą wartość, potem same 0  a następnie free(): invalid pointer, Aborted (core dumped), co mógłbym zrobić? 

komentarz 12 lutego 2019 przez DarthMazut Bywalec (2,990 p.)
Cześć :)

rozumiem, że chcesz przeiterować utworzoną tablicę za pomocą wskaźnika?

Jeśli o to chodzi, to utwórz sobie osobny wskaźnik do tego (np. int* new_wsk), a nie inkrementuj tego, który wskazuje na początek tablicy. Nowy wskaźnik ustaw na początek: new_wsk = &tablica i teraz w pętli wypisz to na co wskaźnik wskazuje: cout << *new_wsk, a po każdej iteracji go inkrementuj new_wsk++.

1 odpowiedź

0 głosów
odpowiedź 12 lutego 2019 przez gagyn Stary wyjadacz (11,050 p.)

Skopiowałem ten kod co podałeś i działa zarówno z użyciem reinterpret_cast jak i bez, czyli: cout << tablica[0] << "\n"; Jednak w tym przypadku używanie reinterpret_cast nie ma sensu i wystarczy odwołać się normalnie do tablicy.

EDIT: Teraz widzę, że nie możesz odwoływać się za pomocą tablica[ile], tylko tablica[0], ponieważ wykonując tablica++, a następnie odwołując się do ostatniej komórki wychodzisz poza zakres tablicy już w pierwszym przebiegu pętli.

komentarz 12 lutego 2019 przez Teslum_369 Gaduła (4,190 p.)

Niestety, u mnie wciąż to samo.

 

komentarz 12 lutego 2019 przez gagyn Stary wyjadacz (11,050 p.)
Spróbuj skompilować i uruchomić bez delete [] tablica.
komentarz 12 lutego 2019 przez Teslum_369 Gaduła (4,190 p.)

Otrzymałem coś takiego:

Tylko teraz dwa pytania,

1) Czy powinienem usunąć "delete [] tablica" ?

2) Nie powinienem ujrzeć jakiegoś adresu komórek?

komentarz 12 lutego 2019 przez DarthMazut Bywalec (2,990 p.)
Napotkany problem jest bardzo dobrze wyjaśniony w pierwszej z kolei odpowiedzi pod postem:

https://forum.pasja-informatyki.pl/127590/cr-c-%2310-wskazniki-dynamiczne-alokowanie-pamieci
komentarz 12 lutego 2019 przez Teslum_369 Gaduła (4,190 p.)

Wszystko ładnie, tylko spotkał mnie chyba ostatni problem, dlaczego program nie może się skompilować? Otrzymuję taki komunikat:

error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]|  

O co tu chodzi i jak to naprawić?

komentarz 12 lutego 2019 przez gagyn Stary wyjadacz (11,050 p.)
Pokaż aktualny kod.

Gdzieś próbujesz potraktować wskaźnik jako wartość zmiennej.
komentarz 13 lutego 2019 przez j23 Mędrzec (194,920 p.)

@Karol_Tesla, chodzi o to, że wskaźnik może być większy od typu int, który najczęściej jest 32-bitowy, nawet na platformach 64-bitowych. Użyj typu intptr_t.

Podobne pytania

0 głosów
2 odpowiedzi 204 wizyt
pytanie zadane 12 listopada 2016 w C i C++ przez Hanuku Nowicjusz (140 p.)
+1 głos
2 odpowiedzi 170 wizyt
0 głosów
1 odpowiedź 235 wizyt

92,551 zapytań

141,393 odpowiedzi

319,522 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!

...