Asignar una dirección de memoria a una variable [duplicada]
¿Cómo asigno una dirección de memoria a una variable para crear una estructura en esa ubicación de memoria? Probé el siguiente fragmento de código para crear una estructura en la dirección de memoria dada, pero ¿simplemente descarga la falla de segmentación?
La ubicación de la memoria en el código es una región de entrada donde necesito configurar ciertos datos y hacer sonar el timbre con un código de operación para que la CPU recoja los datos de entrada y haga lo que el código de operación dice que hace con los datos en la región de entrada
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
Respuestas
Asignar una dirección de memoria a una variable
No hay forma en C ++ de elegir la ubicación exacta de ninguna variable. Solo puede elegir la clase de almacenamiento: automático, estático o local por subprocesos. La implementación del idioma elige la dirección.
¿Cómo asigno una dirección de memoria a ... para crear una estructura en esa ubicación de memoria?
Es posible crear un objeto con almacenamiento dinámico (que no es una variable) en cualquier dirección de memoria siempre que esa memoria esté asignada y no contenga objetos no triviales. Se puede lograr utilizando la nueva expresión de colocación o algunas funciones estándar que realizan la colocación nueva internamente.
No hay forma en C ++ estándar de asignar memoria desde una dirección arbitraria. La implementación del lenguaje se encarga de asignar memoria para variables y objetos dinámicos.
En sistemas integrados sin memoria virtual, la implementación del lenguaje puede documentar rangos de direcciones de memoria específicos según lo asignado. En tal caso, simplemente puede usar la ubicación nueva para crear objetos en esa memoria. El uso de tales direcciones no será portátil a otros sistemas.
¿Qué tal una forma no estándar? Sí, puede existir. Por ejemplo, el estándar POSIX especifica la mmap
función:
pa=mmap(addr, len, prot, flags, fildes, off);
El parámetro
flags
proporciona otra información sobre el manejo de los datos mapeados. El valor de las banderas es el OR inclusivo bit a bit de estas opciones, definido en <sys / mman.h>:Symbolic Constant Description MAP_SHARED Changes are shared. MAP_PRIVATE Changes are private. MAP_FIXED Interpret addr exactly.
Cuando
MAP_FIXED
se establece en el argumento banderas, se informa a la implementación que el valor de pa seráaddr
exactamente.
Sin embargo, considere lo siguiente de las páginas de manual de Linux:
El único uso seguro
MAP_FIXED
es donde el rango de direcciones especificado poraddr
y la longitud se reservó previamente usando otra asignación; de lo contrario, el uso deMAP_FIXED
es peligroso porque elimina a la fuerza las asignaciones preexistentes, lo que facilita que un proceso multiproceso corrompa su propio espacio de direcciones.