Asignar una dirección de memoria a una variable [duplicada]

Aug 18 2020

¿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

1 eerorika Aug 17 2020 at 22:43

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 mmapfunción:

pa=mmap(addr, len, prot, flags, fildes, off);

El parámetro flagsproporciona 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_FIXEDse establece en el argumento banderas, se informa a la implementación que el valor de pa será addrexactamente.

Sin embargo, considere lo siguiente de las páginas de manual de Linux:

El único uso seguro MAP_FIXEDes donde el rango de direcciones especificado por addry la longitud se reservó previamente usando otra asignación; de lo contrario, el uso de MAP_FIXEDes peligroso porque elimina a la fuerza las asignaciones preexistentes, lo que facilita que un proceso multiproceso corrompa su propio espacio de direcciones.