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

Inicjalizacja tablicy znaków c++

Object Storage Arubacloud
0 głosów
2,546 wizyt
pytanie zadane 31 lipca 2018 w C i C++ przez Ptaszor3 Użytkownik (900 p.)

Dzień dobry.

Mam problem z inicjalizacją tablicy znaków. Z tego co mi wiadomo tablica której definicja wygląda tak:

char tablica[3];

ma pojemność 4 znaków. Podczas takiej inicjalizacji tablicy

char tablica[3] = {'w','e','r','t'};

kompilator twierdzi, że tablica jest zbyt krótka, żeby pomieścić tyle znaków. Za to kiedy piszę coś takiego:

char tablica[4] = {'w','r','t','y'}

kompilator nie wyłapuje błędu. Taka instrukcja:

cout << tablica[4];

Wypisuje na ekranie losowy znak;

3 odpowiedzi

+1 głos
odpowiedź 31 lipca 2018 przez RafalS VIP (122,820 p.)

Tablice indeksowane sa od 0.

int tab[3];

Ma zatem 3 elementy: tab[0], tab[1] i tab[2].

0 głosów
odpowiedź 31 lipca 2018 przez j23 Mędrzec (194,920 p.)
edycja 31 lipca 2018 przez j23

kompilator nie wyłapuje błędu.

Bo tam błędu nie ma. To Ty błędnie założyłeś, że przy takiej inicjalizacji kompilator doda zero na końcu. To nie to samo co char tablica[4] = "wrty";, gdzie kompilator powinien krzyknąć, że tablica jest za mała.

0 głosów
odpowiedź 31 lipca 2018 przez Aisekai Nałogowiec (42,190 p.)
Tablice w C++ (jak i w większości języków) są indeksowane od 0.

Zapis char tablica[3] alokuje Ci miejsce w pamięci na 3 chary, do których możesz się odwołać używając tablica[0], tablica[1], tablica[3]. Nie jesteś więc wstanie zapisać 4 charów do 3 elementowej tablicy.

Czemu więc cout<<tablica[4] wypisuje losowy znak a kompilator nie rzuca błędem, tak jak wtedy kiedy chcesz zapisać coś do tablica[4]?  W C++ nie  ma czegoś takiego, że odwołując się do komórki tablicy spoza zakresu (w tym przypadku do 4) kompilator wyrzuci Ci błędem, tylko "odczyta" zawartość znajdującą się pod następnym adresem. Nie pamiętam jak się nazywał ten typ adresacji, ale chodzi o to że zapis tablica[4] jest równoznaczny z odwołaniem się do zawartości komórki, o adresie równym adresowi tablica, przesuniętym o 4  W niektórych językach (takich jak Java) odwołując się do komórki tablicy spoza zakresu kompilator wyrzuca błąd IndexOutOfBoundsException.
komentarz 1 sierpnia 2018 przez Ptaszor3 Użytkownik (900 p.)
Czyli jeżeli stworzę tablice 3 elementową to tylko podczas inicjalizacji sprawdzana jest poprawność długości, a później mogę sobie do takiego 4 elementu coś zapisać, później odczytać i nic mi w tym nie przeszkodzi?
1
komentarz 1 sierpnia 2018 przez j23 Mędrzec (194,920 p.)
Może przeszkodzi, może nie. To jest UB i generalnie operowanie poza dopuszczalnym zakresem tablicy jest błędem.

Podobne pytania

0 głosów
0 odpowiedzi 336 wizyt
0 głosów
2 odpowiedzi 1,830 wizyt
pytanie zadane 24 listopada 2017 w C i C++ przez panstudent Nowicjusz (190 p.)
0 głosów
4 odpowiedzi 337 wizyt
pytanie zadane 23 stycznia 2020 w C i C++ przez Wallen Nowicjusz (160 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...