2010-10-14 12 views
7

Powiel możliwe:
pointer to a specific fixed addressJak zainicjować wskaźnik do określonego adresu pamięci w C++

Ciekawa dyskusja na ten temat rozpoczęła here ale nikt nie był w stanie dostarczyć C++ sposób wykonania:

#include <stdio.h> 

int main(void) 
{ 
    int* address = (int *)0x604769; 
    printf("Memory address is: 0x%p\n", address); 

    *address = 0xdead; 
    printf("Content of the address is: 0x%p\n", *address); 

    return 0; 
} 

Jaki jest najbardziej odpowiedni sposób robisz coś takiego w C++?

+3

Oprócz zmiany na konstrukty C++, nie ma prawdziwej różnicy w sposobie, w jaki robisz to w C++. – CashCow

Odpowiedz

18

W C++ zawsze wolą reinterpret_cast nad C-cast. To takie brzydkie, że ktoś natychmiast dostrzeże niebezpieczeństwo.

Przykład:

int* ptr = reinterpret_cast<int*>(0x12345678); 

To coś rani moje oczy, a mi się podoba.

+1

Przykładowy kod znajduje się w C i OP wie, że jest. Pyta, czy istnieje lepszy sposób na to samo w C++. W sterowniku urządzenia możesz znać adres bezwzględny, na który chcesz pisać. Pamiętam, że robiłem tego typu rzeczy w moich wczesnych dniach z MS-DOS, aby pisać bezpośrednio na ekranie pamięci. Z makrami - oczywiście. – CashCow

+2

Dostęp do rejestrów sprzętowych za pośrednictwem adresów jest powszechną praktyką w systemach wbudowanych. Są one zdefiniowane jako stałe wskaźniki lub deklarowane za pomocą '# define'. –

+1

Dlaczego poszedłeś do "void *"? Kod OP chce wskaźnika do 'int' –

1

Nie ma ŻADNEGO standardowego i przenośnego sposobu, aby to zrobić. Nie przenośne sposoby mogą obejmować reinterpret_cast (someIntRepresentingTheAddress).

0

to będzie działać:

void *address=(void *) 0xdead; // But as mentioned, it's non-standard 

address=(void *) 0xdeadbeef; // Some other address 
+1

Jeśli pytanie brzmi: "co to jest metoda C++", to zignorowałeś sytuację i pogorszyłeś ją, przechodząc z 'void *' –

0

W C++, wolę deklaruje wskazówek jak stałych wskaźników w pliku nagłówka:

volatile uint8_t * const UART_STATUS_REGISTER = (uint8_t *) 0xFFFF4000; 

W języku C, zazwyczaj jest to realizowane za pomocą makra:

#define UART_STATUS_REGISTER ((volatile uint8_t * const) 0xFFFF4000) 

W reszta kodu źródłowego, do adresu pamięci odwołuje się za pomocą nazwy symbolicznej.

1

Dodam, że można zadzwonić do operatora kwalifikacyjny na nowy, jeśli chcesz konstruktor obiektów o nazwie podczas przypisywania go na wskazany adres:

int *pLoc = reinterpret_cast<int*>(0x604769); 
int *address = new (pLoc) int (1234); // init to a value 

ten wykorzystywany jest również do obiektów buforowania pamięci. Utwórz bufor, a następnie przypisz do niego obiekt.

unsigned char *pBuf = new unsigned char[sizeof(CMyObject) + alignment_size]; 
allign_buf(pBuf); 
CMyObject *pMyObj = new (pBuf) CMyObject;