Dostęp do pamięci za pomocą wskaźników

0

Dzień dobry.

  1. Po piersze mam następujący kod:
#include <iostream>
#include <string>
#include <cstdlib>


using namespace std;

int main ()
{
int a=17;  //deklaracja pierwszej zmiennej, którą chcemy odczytać
int b=5; // deklaracja drugiej zmiennej, którą chcemy odczytać

int * pWsk;     //utworzenie wskaźnika, który będzie wskazywał na zmienną a
pWsk=&a;	     //przypisanie wskaźnikowi adresu zmiennej a

int * pWskB;     //utworzenie wskaźnika pWsk, który będzie wskazywał na zmienną b
pWskB=&b;	     //przypisanie wskaźnikowi pWskB adresu zmiennej b

cout<<pWsk<<"   "<<*pWsk<<endl;    // wyświetlenie zawartości wskaźnika pWsk (adres zmiennej a) i wartości zmiennej, na którą wskazuje wskaźnik
cout<<pWskB<<"   "<<*pWskB<<endl;    // wyświetlenie zawartości wskaźnika pWskB (adres zmiennej b) i wartości zmiennej, na którą wskazuje wskaźnik
cout<<endl<<endl<<endl;  // znaki nowej linii


int *wskaznik;		// drugi wskaźnik	
string pobierz;         // deklaracja zmiennej, do której z klawiatury chcemy wpisać adres zmiennej
cout<<"adres: ";   cin>>pobierz;  //pobieranie znaków z klawiatury do zmiennej pobierz

wskaznik=atoi(pobierz.c_str());   //przypisanie wskaźnikowi skonwertowanego adresu pobranego z klawiatury z typu string na int (czyli na typ wskaźnika)
cout<<wskaznik<<"   "<<*wskaznik;  // wyświetlenie adresu przechowywanego przez wskaźnik i zawartości komórki pamięci, na którą ten wskaźnik wskazuje


	return 0;
} 

Jak widać mamy tam zmienną a, następnie przypisujemy jej adres wskaźnikowi pWsk i wyświetlamy zawartość wskaźnika (a więc adres zmiennej a przechowywany przez wskaźnik pWsk) oraz zawartość komórki pamięci, na którą wskazuje wskaźnik (czyli zawartość zmiennej a). I teraz mój problem. Otóż chciałbym dalej (poniżej) móc wpisać z klawiatury wyświetlony adres przechowywany przez wskaźnik pWsk (adres zmiennej a), co w następstwie spowodowało by wyświetlenie adresu zmiennej a (ponownie) i jej zawartości - ale na podstawie wpisanego jej adresu. Zamiast adresu zmiennej a można by wpisać adres zmiennej b. I teraz problem mam z tą linijką wskaznik=atoi(pobierz.c_str()); . Ponieważ kompilator zwraca mi błędy. Kombinuję już dłuższy czas i nic. To jak to zrobić?

  1. Po drugie - czy wskaźnik pozwala na dostęp do pamięci tylko w obrębie programu, w którym został uruchomiony, czy też istnieje możliwość pobrania/ewentualnie zapisania wartości komórki pamięci drugiego programu?

Czyli np. mam dwa programy. W pierszym tworzę zmienną i przypisuję jej wartość np. niech będzie 17. W tym programie wyświetlam jej adres w pamięci RAM pobrany wskaźnikiem (np. 0x7fff57917bbc ) I ten program pozostaje ciągle uruchomiony. Uruchamiam drugi program i w tym programie wpisuje znany mi adres komórki (czyli 0x7fff57917bbc ), co powoduje wyświetlenie jej zawartości przez program drugi (czyli wyświetli 17). Czy to się da zrobić za pomocą wskaźników? Jeśli tak to jak tego dokonać? Ja próbowałem, lecz nie mi nie działało.

  1. Czy da się za pomocą wskaźników uzyskać dostęp do dowolnej komórki pamięci (tzn. pobrać zawartość komórki i zapisywać nową zawartość owej komórki)?
    Np. chciałbym utworzyć wskaźnik i następnie przypisać mu adres dowolnej (wybranej) komórki pamięci, a następnie zawartość owej komórki pamięci wyświetlić.
    Dowolnej komórki ma oznaczać, że mogę sobie wybrać jaką kolwiek, którą zechcę komórkę z całej zawartości pamięci RAM? Coś w stylu:
 int *wskaznik; 
wskaznik = 99283; // wpisanie adresu wybranej komórki 
cout << *wskaznik; // wypisanie zawartości wybranej komórki pamięci

Tylko że to nie działa. Czy to się da zrobić?

0

Gdyby istnialo cos takiego, jak wskaznik, ktory moze pokazac w dowolne miejsce i operowac na tych danych to zaden OS nie bylby bezpieczny :)

0

W systemach z trybem chronionym pamięci / pamięcią wirtualną (wszystkie popularne systemy), wskaźniki w C++ nie pokazują bezpośrednio na komórki fizycznej pamięci, tylko wskazują adresy logiczne. Adresy logiczne mogą być skojarzone z danymi znajdującymi się na twardym dysku, w RAM, albo w ogóle nie być skojarzone z żadną fizyczną reprezentacją pamięci (np. pamięć alokowana leniwie, zanim wskaźnik zostanie użyty). Dlatego to co chcesz zrobić nie ma najmniejszego sensu.

Miałoby to sens tylko w systemie z adresowaniem rzeczywistym (np. na jakimś prostym mikrokontrolerze, gdzie w ogóle nie ma systemu operacyjnego).

  1. Po drugie - czy wskaźnik pozwala na dostęp do pamięci tylko w obrębie programu, w którym został uruchomiony, czy też istnieje możliwość pobrania/ewentualnie zapisania wartości komórki pamięci drugiego programu?

W systemach z trybem chronionym tylko w obrębie programu. Do komunikacji między programami służą specjalne mechanizmy np. pamięć współdzielona, RPC, sokety/potoki itp.

0

Czyli na Windows i systemach Unix-owych (np. Linux, OS X) - wskaźnik pozwala na uzyskiwanie dostępu do pamięci w obrębie tylko programu, w którym został on zadeklarowany. Tak?

No dobrze, to dlaczego teraz nie działa mi kod z punktu pierwszego.
Przecież próbuję się dostać do zmiennej z tego samego programu, w którym jest zadeklarowany wskaźnik.
Po uruchomieniu tworzone są dwie zmienne, wyświetlane są ich adresy. Ja wybieram jedną z nich i następnie wpisuje adres wybranej zmiennej.
Ten wpisany adres jest przypisywany wskaźnikowi (z tego samego programu) i dlaczego to nie działa?
Czy da się ten kod poprawić, aby działał prawidłowo.

0

dodaj sobie #include <cstdio> i użyj scanf("%p",&wskaznik); zamiast tego wskaznik=atoi(pobierz.c_str());. Niestety nie wiem jak wprowadzać adres na który ma wskazywać wskaźnik za pomocą std::cin ale w C używałam scanf("%p",&ptr); i działało. scanf jako argument przyjmuje adres zmiennej do której ma coś wpisać, więc nie dziw się czemu jest &ptr zamiast ptr.

0

@qws jeśli potrzebujesz takich operacji to poczytaj o pamięci dzielonej (shared memory).

1
int x = std::stoi(pobierz);
wskaznik = &x;
0

string *wskaznik2; // drugi wskaźnik
string pobierz; // deklaracja zmiennej, do której z klawiatury chcemy wpisać adres zmiennej
cout<<"adres: "; cin>>pobierz; //pobieranie znaków z klawiatury do zmiennej pobierz
wskaznik2 = &pobierz;//przypisywanie pamieci //jesli chcemy wartosc to do *wskaznik2//znak & umozliwia pobranie adresu komorki
cout<<wskaznik2<<" "<<*wskaznik2; // wyświetlenie adresu przechowywanego przez wskaźnik i zawartości komórki pamięci, na którą ten wskaźnik wskazuje

typ wskzanika domyslnie na string i zalatwione a nie probujesz int wskzanikowi przypisac adres sformatowanej zmiennej tekstowej na int a jak ktoś wpisze jakiś wyraz to Ci nie odczyta tego. "Odpowiedz 5 lat poxniej xDDDDDD"

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