114
ROZDZIAŁ 17. WSKAŹNIKI
llllllllll * (unsigned char) 255
Gdybyśmy natomiast stworzyli inny wskaźnik do tego adresu tym razem typu unsigned long* to przy próbie odczytu odczytane zostaną dwa bajty z wartością zapisaną w zmiennej unsigned int oraz dodatkowe dwa bajty z niewiadomą zawartością i wówczas wynik będzie równy 65530 * 65536 -f losowa wartość :
+--------+--------+--------+--------+
+--------+--------+--------+--------+
I11111111I111110101????????I????????|
Ponadto, zapis czy odczyt poza przydzielonym obszarem pamięci może prowadzić do nieprzyjemny di skutków takich jak zmiana wartości innych zmiennych czy wręcz natychmiastowe przerwanie programu. Jako przykład można podać ten (błędny) program1:
tfinclude <stdio.h> int main(void)
unsigned char tab(10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; unsigned short *ptr» (unsigned short*)&tab[2]; unsigned i;
•ptr * 0xffff; for (i = 0; i < 9; ++i) { printf("%d ", tab[i]);
>
printf("7,d\n", tab(9]); return 0;
Nie można również za]X)minać, że na niektórych architekturach dane wielobajto-we muszą być odpowiednio wyrównane w pamięci. Np. zmienna dwubajtowa może się znajdować jedynie pod parzystymi adresami. Wówczas, gdybyśmy cltcieli adres zmiennej jednobajtowej przypisać wskaźnikowi na zmienną dwubajtową mogłoby dojść do nieprzewidzianych błędów wynikających z próby odczytu niewyrównanej danej.
Zaskakujące może się okazać, że różne wskaźniki mogą mieć różny rozmiar. Np. wskaźnik na char może być większy od wskaźnika na int, ale również na odwrót. Co więcej, wskaźniki różnych typów mogą się różnić reprezentacją adresów. Dla przykładu wskaźnik na char może przechowywać adres do bajt u natomiast wskaźnik na int ten adres potlziclony przez 2.
MoŻe s*ię okazać, że błąd nie będzie widoczny na Twoim komputerze.