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

Dostęp do pamięci za pomocą wskaźników
QW
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:15
0

Dzień dobry.

  1. Po piersze mam następujący kod:
Kopiuj
#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:
Kopiuj
 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ć?

xfin
  • Rejestracja:prawie 12 lat
  • Ostatnio:10 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
0

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

n0name_l
A nie istnieje? rotfl.
KR
pokazywać sobie może i w sufit, ale zrobienie czegokolwiek z takim wskaźnikiem będzie UB. I nie, nie tylko dereferencja, ale zrobienie czegokolwiek z takim wskaźnikiem jest zabronione przez standard.
xfin
@n0name_l - jw. pokazac sobie moze. Ale operacje sa zabronione - jak wyobrazasz sobie istnienie wskaznika, ktory moze modyfikowac COKOLWIEK na co pokazuje? Wszystkie mechanizmy bezpieczenstwa bylyby o kant d*** rozbic.
n0name_l
Zwyczajnie. Moze to przez to, ze nie ograniczam sie do myslenia o kalkulatorach na windowsy. A UB to sobie moze byc. Dodawanie intow to tez w teorii UB.
KR
Moderator
  • Rejestracja:około 21 lat
  • Ostatnio:24 minuty
  • Postów:2964
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.

edytowany 2x, ostatnio: Krolik
QW
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:15
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.

edytowany 2x, ostatnio: qws
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
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.


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
gośćabc
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Szczecin
  • Postów:500
1
Kopiuj
int x = std::stoi(pobierz);
wskaznik = &x;
Cpp programista
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:1
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"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.