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

Kilka pytań dotyczących wskaźników w C

Object Storage Arubacloud
+2 głosów
228 wizyt
pytanie zadane 14 czerwca 2016 w C i C++ przez ElPiwo Początkujący (370 p.)
zmienione kategorie 14 czerwca 2016 przez Arkadiusz Waluk
Dzień dobry, mam kilka pytań dotyczących wskaźników w języku C.

 

1. Czym się rożni sizeof dla tablicy od sizeof dla wskaźnika?
2.Kiedy rzutowanie wskaźnika do innego typu może doprowadzić do utraty danych?
3. W jakich sytuacjach możemy uzyskać dostęp do tablicy poza jej granicami i dlaczego jest to trudne do wykrycia?  

4.  w jakich sytuacjach należy sprawdzać czy wskaźnik jest nullem

Prosiłbym o w miarę jasne wytłumaczenie zagadnień :)

Dziękuje i pozdrawiam :)
komentarz 14 czerwca 2016 przez Ehlert Ekspert (212,670 p.)

Zmień też kategorię pytania. smiley

2 odpowiedzi

0 głosów
odpowiedź 14 czerwca 2016 przez niezalogowany
  1. Można o tym przeczytać choćby w dokumentacji: http://en.cppreference.com/w/cpp/language/sizeof
  2. Mówisz konkretnie o czym? O rzutowaniu na void* oraz z void* ?
  3. Nie jestem pewny o co ci chodzi, chodzi ci o uzyskanie dostępu do elementu tablicy większego niż jej rozmiar? Np, int a[10], i próbuję zrobić coś takiego: a[10] = 3;

 

0 głosów
odpowiedź 14 czerwca 2016 przez Ehlert Ekspert (212,670 p.)
edycja 14 czerwca 2016 przez Ehlert

Wskaźnik zwykły a wskaźnik na tablicę nieco się różnią.

  1. kompilator przy użyciu operatora sizeof na tablicy dynamicznej zmiennej tablicowej ogarnie że chodzi o pamięć zarezerwowaną przez tablicę. W przypadku zwykłego wskaźnika zwróci 4 bajty dla systemu 32 bitowego i odpowiednio 8 bajtów dla systemu 64 bitowego.
  2. Kiedy rzutujesz np float do integer'a? Nie jestem pewien czy zrozumiałem.
  3. Podczas przekazywania tablicy jako argumentu do  funkcji. Operujesz wtedy na wskaźniku i wyjście poza jej rozmiar nie wywali żadnego błędu a może doprowadzić do wycieku pamięci itp.
  4. Sprawdzasz czy wskaźnik NIE jest nullem przed wywołaniem delete/free. Dobrym nawykiem jest podpisanie pod niego NULL/nullptr po wywołaniu tychże funkcji. W przeciwnym wypadku jest to tzw dangling pointer i nie jest to bezpieczna rzecz.

Mam nadzieję, że w miarę. Jeśli chcesz to naprawdę dobrze zrozumieć polecam przeczytać Rusz głową! C. Polecam!

 

 

 

 

1
komentarz 14 czerwca 2016 przez draghan VIP (106,230 p.)
edycja 14 czerwca 2016 przez draghan

kompilator przy użyciu operatora sizeof na tablicy dynamicznej ogarnie że chodzi o liczbę zarezerwowanych miejsc.

Jesteś pewny?

EDIT: co do 3. też miałbym pewne uwagi. Na przykład - możliwość dostępu do elementu spoza tablicy mamy... zawsze. Jeśli nie będziemy zapisywać nic w obszar pamięci, który "nie jest nasz", wtedy będzie to bardzo ciężkie do wykrycia. Przy próbie zapisu możemy natrafić na access violation, jeśli mamy szczęście i piszemy program dla jakiegoś systemu operacyjnego. :)

komentarz 14 czerwca 2016 przez obl Maniak (51,280 p.)

kompilator przy użyciu operatora sizeof na tablicy dynamicznej ogarnie że chodzi o liczbę zarezerwowanych miejsc.

Niestety, sizeof tablicy statycznie utworzonej zwróci liczbę bajtów całej tablicy dla tablicy przydzielonej dynamicznie zwróci rozmiar adresu pamięci czyli 4 bajty w 32 bitowych systemach i 8 bajtów w 64 bitowych.

komentarz 14 czerwca 2016 przez Ehlert Ekspert (212,670 p.)

Poprawione. W kwestii wyjaśnienia

    int matrix[] = {1, 5, 6, 4, 3};
    int* pointer = matrix;
    // 20
    // 5 razy po 4 bajty
    cout << sizeof(matrix) << "\n"; 
    
    // 4 lub 8 w zalezności od systemu
    cout << sizeof(pointer) << "\n";

 

komentarz 14 czerwca 2016 przez Radfler VIP (101,030 p.)

Sprawdzasz czy wskaźnik NIE jest nullem przed wywołaniem delete/free.

Nie jest to wymagane, operator delete/funkcja free robią to za nas:

using T = ...;

delete static_cast<T*>(nullptr); // no-op
free((T*)NULL); // no-op

Podobne pytania

0 głosów
1 odpowiedź 140 wizyt
pytanie zadane 17 listopada 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
0 głosów
4 odpowiedzi 629 wizyt
pytanie zadane 18 maja 2016 w Rozwój zawodowy, nauka, praca przez Mrx Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 183 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...