Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wpisywanie zmiennej do konkretnej komórki pamięci

Ostatnio zmodyfikowano 2009-09-02 22:32
Autor Wiadomość
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:
C/C++
#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...
P-10016
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.
P-10019
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.
P-10028
DejaVu
» 2009-09-02 23:48:23
Sam obrazek powinien być wystarczający do zrozumienia różnicy między Little Endian i Big Endian.

http://en.wikipedia.org/wiki/File:Endianessmap.svg
P-10030
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).
P-19267
manfred
» 2009-09-02 22:29:20
P-19269
manfred
» 2009-09-02 22:32:42
<<tja, bo browser i net nawalają>>
P-19270
« 1 »
  Strona 1 z 1