2010-08-29 24 views
5

Dada una dirección de memoria literal en formato hexadecimal, ¿cómo puedo crear un puntero en C que se dirija a esta ubicación de memoria?dirección de memoria literal

Las direcciones de memoria en mi plataforma (IBM iSeries) son 128bits. El tipo C long long también tiene 128 bits.

Imagínese que tengo una dirección de memoria a una cadena (matriz de caracteres) es decir: C622D0129B0129F0

supongo que la sintaxis de C correcta para abordar directamente esta posición de memoria:

const char* const p = (const char* const)0xC622D0129B0129F0ULL

utilizo ULL sufijo indica unsigned long long literal.

Ya sea que mi kernel/plataforma/sistema operativo me permita hacer esto, es una pregunta diferente. Primero quiero saber si mi sintaxis es correcta.

+3

Infierno de un espacio de direcciones. – GManNickG

+0

Esto es lo que solía ser el AS/400. El infierno de una máquina en general. –

Respuesta

12

Su sintaxis es casi correcta. No es necesario uno de los const:

const char* const p = (const char*)0xC622D0129B0129F0ULL 

El const inmediatamente antes p indica que la variable de p no se puede cambiar después de la inicialización. No se refiere a nada sobre lo que apunta p, por lo que no lo necesita en el lado derecho.

+0

El compilador que lo acepta es un buen lugar para comenzar, pero no garantiza el cumplimiento de los estándares. Hay muchas extensiones implementadas en compiladores. Dicho eso, sí, esto parece correcto. –

+1

No, esto es un comportamiento indefinido. Solo se supone que la conversión a 'void *' da algo correcto y 'uintptr_t' puede ser diferente de' unsigned long long' (aunque improbable en este caso) –

+2

Jens está equivocado - el comportamiento está definido por la implementación, * no * undefined – Christoph

0

No existe tal cosa como una dirección literal en C.

Lo único que está garantizado para trabajar entre los enteros y los punteros se echa de la void* a uintptr_t (si existe) y luego de vuelta. Si obtuvo su dirección de algún lugar como un entero, debería ser del tipo uintptr_t. Use algo como

(void*)(uintptr_t)UINTMAX_C(0xC622D0129B0129F0) 

para convertirlo de nuevo.

Debería incluir stdint.h para obtener el tipo uintptr_t y el macro UINTMAX_C.

+0

-1: C99 solo define macros para las constantes enteras de ancho mínimo y ancho máximo; no hay macro 'UINTPTR_C()' en 'stdint.h' – Christoph

+0

@Christoph: su segunda afirmación es correcta. Voy a editar mi respuesta en consecuencia. –

+0

eliminado voto a la baja; arregló el '0x' que faltaba también ... – Christoph

Cuestiones relacionadas