2012-04-28 15 views
6

¿Puedo asignar una dirección de memoria específica usando punteros en C++?¿Puedo asignar una dirección de memoria específica usando punteros en C++?

Por ejemplo: Asigne esta dirección de memoria 25D4C3FA y ponga 4 en ella.

+3

¿Por qué quieres hacer eso? (¿Estás en un entorno sin memoria virtual?) – Mat

+1

Sí, ¿y si esa dirección ya está en uso? –

+3

Esto es completamente específico de la plataforma, por lo que debe especificar a qué plataforma se dirige y por qué debe hacerlo. –

Respuesta

17

Asignando una dirección específica en el espacio de direcciones de su proceso es un poco complicado y específico de la plataforma. En los sistemas Unix, mmap() es probablemente lo más cercano que va a obtener. El equivalente de Windows es VirtualAlloc(). Por supuesto, no hay garantías ya que la dirección ya puede estar en uso.

escritura a una dirección específica es trivial:

char *p = (char*)0x25D4C3FA; 
*p = 4; 

que se supone que tiene buenas razones para querer hacerlo.

+4

Vale la pena agregar que en Windows, uno querría llamar a 'VirtualAlloc'. – Fanael

+0

@Fanael: Gracias por la sugerencia. Respuesta actualizada – NPE

+0

¿Puede darme un ejemplo en VirtualAlloc para asignar esta dirección? 25D4C3FA – faressoft

0

Suponiendo que al asignar en realidad se refiere a acceso,

Puede, pero si la dirección no es válida o no accesible, entonces deferencing la dirección dará lugar a un comportamiento indefinido.
Así que no es una buena idea hacerlo.

+0

No, en C++ estándar no se puede. Puede establecer un puntero a 0x25f4c3fa e intentar usarlo, pero esto no es "asignar". –

+0

@MatteoItalia: OP significa establecer un puntero en lugar de asignar aquí si lee el q completo. –

+5

La pregunta es bastante ambigua, pero específicamente dice "asignar" varias veces. –

0

Puede solicitar una dirección específica a través de VirtualAlloc en Windows, y espero que otros sistemas operativos hagan lo mismo, pero no hay garantías ni medios independientes de la plataforma.

2

En Windows, sí.

pseudo-código:

Pointer desiredAddress = 0xD0000000; 

//allocate 1 KB at our desired address 
Pointer p = VirtualAlloc(desiredAddress, 1024, 
     MEM_COMMIT | MEM_RESERVE, 
     PAGE_READWRITE); 
Cuestiones relacionadas