114 ROZDZIAŁ 17. WSKAŹNIKI +--------+ |komórka1| +--------+ |11111111| = (unsigned char) 255 +--------+ Gdybyśmy natomiast stworzyli inny wskaźnik do tego adresu tym razem typu unsi- gned 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ów- czas wynik będzie równy 65530 * 65536 + losowa wartość : +--------+--------+--------+--------+ |komórka1|komórka2|komórka3|komórka4| +--------+--------+--------+--------+ |11111111|11111010|????????|????????| +--------+--------+--------+--------+ Ponadto, zapis czy odczyt poza przydzielonym obszarem pamięci może prowadzić do nieprzyjemnych skutków takich jak zmiana wartości innych zmiennych czy wręcz natychmiastowe przerwanie programu. Jako przykład można podać ten (błędny) pro- gram3: #include 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
(…)
… <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("%d\n", tab[9]);
return 0;
}
Nie można również zapominać, że na niektórych architekturach dane wielobajtowe muszą być odpowiednio wyrównane w pamięci. Np. zmienna dwubajtowa…
... zobacz całą notatkę
Komentarze użytkowników (0)