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

       Wyjaśnienie

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   
im. Kazimierza Brodzińskiego
w Tarnowie

©2024 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

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