Wpisywanie zmiennej do konkretnej komórki pamięci
Ostatnio zmodyfikowano 2009-09-02 22:32
aRusher Temat założony przez niniejszego użytkownika |
Wpisywanie zmiennej do konkretnej komórki pamięci » 2009-09-02 20:27:11 Więc tak. Sprawa dotyczy operatora new (i new[]), a w zasadzie jego wersji przeznaczonej do umiejscawiania tworzonego obiektu/tablicy w konkretnej komórce pamięci. Oto mój kod: #include <iostream> using namespace std;
int main() { int dzialka[ 200 ]; for( int i = 0; i < 200; i++ ) dzialka[ i ] = 1; cout << "Wstaw element na wybrany adres miedzy: " << reinterpret_cast < int >( & dzialka[ 100 ] ) << " a " << reinterpret_cast < int >( & dzialka[ 104 ] ) << endl; void * cel = & dzialka[ 100 ]; int adres; cin >> adres; cel = reinterpret_cast < void *>( adres ); int * liczba = new( cel ) int( 114 ); for( int i = 99; i < 105; i++ ) { cout << "dzialka[" << i << "] = " << dzialka[ i ] << endl; } system( "pause" ); } Spróbujcie go skompilować i na pytanie o adres komórki wpisać adres o jeden większy od początku przedziału (granice przedziału będą wyświetlone w programie). Zostaną wam wyświetlone poszczególne wartości obiektów w tablicy "dzialka". Większość z nich będzie równa jeden (bo na początku do wszystkich elementów wpisane zostało jeden. Zwróćcie jednak uwagę na element o indeksie 100 tablicy typu int. Jeśli wpisaliście tak, jak prosiłem, to przyjmie on wartość 29185. Z kolei następny element (o indeksie 101) zostanie wyzerowany. I pytanie: Dlaczego tak się dzieje? Wiem, że wpisywanie obiektu int o wartości 114 rozpoczyna się od drugiego z czterech bajtów elementu [100] tablicy "dzialka" w związku z tym, że w zapisie binarnym obiekt typu int o wartości 114 przedstawia się następująco: 0000 0000 0000 0000 0000 0000 0111 0010 A w obiekcie dzialka[100] zmieszczą się trzy pierwsze bity (3 pary po 4 zera), to według mnie obiekt ten (dzialka[100]) powinien zostać wyzerowany, a kolejny obiekt (dzialka[101]) powinien przedstawiać się następująco: 0111 0010 0000 0000 0000 0000 0000 0001 Chyba jeszcze za mało wiem o tych sprawach... |
|
aRusher Temat założony przez niniejszego użytkownika |
» 2009-09-02 22:19:30 Mógłbyś rzucić jakimś dobrym artykułem na ten temat? Bo widzę, że mam wielkie braki. Słyszałem o czymś takim jak big endian, ale nigdy tego pojęcia nie zgłębiłem. |
|
aRusher Temat założony przez niniejszego użytkownika |
» 2009-09-02 23:00:17 Dlatego, że prosiłem o polecenie mi jakiegoś dobrego artykułu, choć teraz widzę, że to niepotrzebne. |
|
DejaVu |
» 2009-09-02 23:48:23 |
|
manfred |
» 2009-09-02 20:39:50 Endian, kolego, endian! Na x86 114 to 01110010 00000000 00000000 00000000, więc nadpisujesz drugi bajt komórki 100, czyli, ponieważ pierwszy jest równy jeden, powodujesz, że ta ma wartość 29185 (kolejno bajty: 1, 114, 0, 0), oraz pierwszy komórki 101, ustawiając go na 0, przez co sama komórka ma wartość 0 (inne bajty już były zerowe). |
|
manfred |
» 2009-09-02 22:29:20 |
|
manfred |
» 2009-09-02 22:32:42 <<tja, bo browser i net nawalają>> |
|
« 1 » |