[C++] Dziwne zachowanie wskaźnika - to przecież nie tak powinno działać

0

Chcąc upewnić się, że moja wiedza na temat wskaźników jest wystarczająca napisałem dwa krótkie programy:

1:

#include <iostream>

using namespace std;

int main()
{
	int lol;
	int *adres_lola=&lol;
	cout << "Wartosc lola: " << lol << endl << "Adres lola: " << reinterpret_cast<unsigned int>(adres_lola) << endl;
	getchar();
	cout << "Aktualna wartosc lola: " << lol << endl;
	getchar();

	//int *test;
	//int liczba=5;
	//int adres=0x0012FF74;
	//*test=liczba;
	//cout << "Wstawilem pod adres: " << adres << " wartosc " << liczba << "." << endl;
	//getchar();
}

2:

#include <iostream>

using namespace std;

int main()
{
	//int lol;
	//int *adres_lola=&lol;
	//cout << "Wartosc lola: " << lol << endl << "Adres lola: " << reinterpret_cast<unsigned int>(adres_lola) << endl;
	//getchar();
	//cout << "Aktualna wartosc lola: " << lol << endl;
	//getchar();

	int *test;
	int liczba=5;
	int adres=0x0012FF74;
	*test=liczba;
	cout << "Wstawilem pod adres: " << adres << " wartosc " << liczba << "." << endl;
	getchar();
}

W przypadku pierwszego programu, nie wpisywałem do zmiennej lol wartości, bo mam świadomość tego, że wartość zmiennych automatycznych przechowywana jest na stosie i tym samym chciałem się upewnić, że wartość nadal nie będzie taka jak wpisuje ją program drugi przy ponownym uruchomieniu programu 1. Rezerwowany adres dla zmiennej lol zawsze jest taki sam, dlatego w drugim programie wpisałem tę wartość na sztywno.

Problem:

Uruchamiam program pierwszy i na pierwszym getchar(); zawieszam program. Uruchamiam program 2 po czym kontynuuję program 1 i ku mojemu zdziwieniu wartość przechowywana pod adresem zmiennej lol pozostaje bez zmian, a przecież powinna pokazać 5, dlaczego tak się dzieje?

0

yyyy... NIE! Po pierwsze z drugiego programu nie masz dostępu do pamięci pierwszego! (przynajmniej nie w taki sposób)
Po drugie zainicjalizowałeś zmienną adres jakimiś cyferkami... i co z tego? Poza wypisaniem nic z nią nie robisz.

0
byku_guzio napisał(a)

yyyy... NIE! Po pierwsze z drugiego programu nie masz dostępu do pamięci pierwszego! (przynajmniej nie w taki sposób)
Po drugie zainicjalizowałeś zmienną adres jakimiś cyferkami... i co z tego? Poza wypisaniem nic z nią nie robisz.

No to cyferki którymi zainicjowałem zmienna adres to przecież adres zmiennej lol zapisany w inny sposób.

A to w jaki sposób mogę uzyskać dostęp do pamięci innego programu - żebym mógł wykonać zamierzony cel - zmienić wartość zmiennej z innego programu.

0

@Nequrian proponuję poczytać o tym w jaki sposób pamięć jest przydzielana procesom. Dowiedziałbyś sie że od czasów DOSa minęło już kilkadziesiąt lat i w taki prosty sposób do pamięci innego procesu to się nie dostaniesz.

0
Shalom napisał(a)

@Nequrian proponuję poczytać o tym w jaki sposób pamięć jest przydzielana procesom. Dowiedziałbyś sie że od czasów DOSa minęło już kilkadziesiąt lat i w taki prosty sposób do pamięci innego procesu to się nie dostaniesz.

A mogę prosić jakąś dobrą literaturę na ten temat?

I rozumiem, że tym samym w każdym systemie operacyjnym będzie to działało inaczej?

Tzn. np. przydzielanie pamięci procesom w Windows XP przebiega inaczej niż w Windows 7?

0
Shalom napisał(a)

google gryzie?
http://www.mimuw.edu.pl/~kubica/sop/wyklad7/wyklad.html
http://www.mimuw.edu.pl/~kubica/sop/wyklad8/wyklad.html

Pytałem o literaturę (czyt. książkę), niemniej jednak dziękuję.

0

Trzeba było od razu mówić że chcesz książki na ten temat. Proponuję zacząć od klasyki:
"Podstawy Systemow Operacyjnych" Abraham Silberschatz
A jeśli interesuje cię programowanie systemowe to pod linuxa masz dwie pozycje warte uwagi:
"Programowanie w środowisku systemu UNIX" Richard Stevens
"Advanced Linux Programming" Mark Mitchell

1 użytkowników online, w tym zalogowanych: 0, gości: 1