P007 - Ucieczka wskaźnika |
---|
Program uruchomiono w środowisku Bloodshed Dev-C++ 4.9.9.2 |
// I Liceum Ogólnokształcące // im. K. Brodzińskiego // w Tarnowie //-------------------------- // Koło informatyczne 2006/7 //-------------------------- // Program: P007 //-------------------------- #include <iostream> using namespace std; main() { int a[10],b[10],c[10],i; int * p; p = c; for(i = 0; i < 34; i++) * (p + i) = 625; cout << "a[] = "; for(i = 0; i < 10; i++) cout << a[i] << " "; cout << "\nb[] = "; for(i = 0; i < 10; i++) cout << b[i] << " "; cout << "\nc[] = "; for(i = 0; i < 10; i++) cout << c[i] << " "; cout << endl << endl; system("pause"); } |
Widok okienka konsoli w uruchomionym programie |
---|
a[] = 625 625 625 625 625 625 625 625 625 625 b[] = 625 625 625 625 625 625 625 625 625 625 c[] = 625 625 625 625 625 625 625 625 625 625 |
Program demonstruje "szalejący" po pamięci wskaźnik. Operacje na pamięci wykonywane przy pomocy wskaźników nie są sprawdzane przez kompilator i mogą prowadzić do trudnych do wykrycia błędów (po prostu zakłada się, iż programista stosujący wskaźniki dokładnie wie co robi). W naszym przykładzie wypełniamy liczbą 625 obszar pamięci o rozmiarze 34 liczb int (po 4 bajty każda). Widzimy wyraźnie, iż zapisaniu uległy trzy tablice a[], b[] oraz c[]. Na szczęście nie było pomiędzy nimi cennych danych, gdyż uległyby niespodziewanemu zniszczeniu.
Do zapamiętania:
Zawsze przemyśl operację przy pomocy wskaźnika. Nie ma tu kontroli, więc przypadkowo możesz coś zniszczyć.
Poeksperymentuj z tym programem, np. zmniejsz ilość obiegów pierwszej pętli for. Da ci to informację o rozłożeniu kolejnych zmiennych w pamięci komputera. Zauważ również, iż tablice a[], b[] i c[] nie są umieszczone w pamięci obok siebie, lecz z odstępem 4 bajtów. Jednakże uważaj - te własności są specyficzne dla kompilatora Dev-C++. W innych kompilatorach może być zupełnie inaczej!!!
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe