38991

38991



114


ROZDZIAŁ 17. WSKAŹNIKI

+--------►

IkomórkalI +--------+

llllllllll * (unsigned char) 255

•f-------—f

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ść :

+--------+--------+--------+--------+

IkomórkalIkomórka2Ikomórka3Ikomórka4I

+--------+--------+--------+--------+

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.

1

MoŻe s*ię okazać, że błąd nie będzie widoczny na Twoim komputerze.



Wyszukiwarka

Podobne podstrony:
126 ROZDZIAŁ 17. WSKAŹNIKI I struct urządzenie moje_urzadzeuie; moje_uxzadzenie.nl =
116 ROZDZIAŁ 17. WSKAŹNIKI Wskaźniki można również od siebie odejmować, czego wynikiem jest
118 ROZDZIAŁ 17. WSKAŹNIKI Zwróćmy uwagę na wywołanie func(kz);. Należy pamiętać, by do funkcji
120 ROZDZIAŁ 17. WSKAŹNIKI Wskaźniki na stalą wartość są przydatne między innymi w sytuacji gdy mamy
122 ROZDZIAŁ 17. WSKAŹNIKI Ostatnią funkcją jest funkcja ca!loc(). Przyjmuje ona dwa argumenty: licz
124 ROZDZIAŁ 17. WSKAŹNIKI określone miejsce w pamięci. A ponieważ funkcja ma swój adres®, to nie ma
126 ROZDZIAŁ 17. WSKAŹNIKI { struct urządzenie moje.urządzeńle; moje.urzadzenie.m -
3 6 (4) 3 -6 WSKAŹNIKI I URZĄDZENIA KONTROLNE DESKA ROZDZIELCZA 3    4 17 16 15
Habermas09 114 Rozdział III nia etyczne, które są zorientowane na telos każdorazowo mojego albo nasz

więcej podobnych podstron