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

Odpowiedz Nowy wątek
2014-07-14 12:15
qws
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ć?

Pozostało 580 znaków

2014-07-14 12:19
0

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

A nie istnieje? rotfl. - n0name_l 2014-07-14 12:23
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. - Krolik 2014-07-14 12:30
@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. - xfin 2014-07-14 12:37
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. - n0name_l 2014-07-14 12:41

Pozostało 580 znaków

2014-07-14 12:27
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, 2014-07-14 12:35

Pozostało 580 znaków

2014-07-14 12:41
qws
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, 2014-07-14 12:45

Pozostało 580 znaków

2014-07-14 12:42
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!

Pozostało 580 znaków

2014-07-14 13:18
0

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


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2014-07-14 16:04
1
int x = std::stoi(pobierz);
wskaznik = &x;

Pozostało 580 znaków

2019-01-19 10:53
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"

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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