operadores - ¿Pueden las direcciones de punteros en dos programas ser iguales?
punteros y matrices en c (6)
El lenguaje C no especifica la interacción entre dos procesos diferentes. No hay garantía de que los punteros en dos programas diferentes tengan una conexión significativa entre sí.
Si especifica el sistema operativo, el compilador de C y cómo se ejecutan los programas, se puede proporcionar una respuesta que lo ayudará.
Sin embargo, esto no es algo que el lenguaje C intente controlar, y depende completamente del sistema operativo y del hardware que ejecuta los programas.
Cuando dos programas se ejecutan al mismo tiempo e imprime la dirección a la que apunta el puntero, ¿puede suceder que ambos programas impriman el mismo valor?
El título de tu pregunta no coincide exactamente con el cuerpo. El título pregunta:
¿Puede la dirección de punteros en dos programas ser igual?
Sí, eso es posible, ya que otros ya han señalado que hay memoria virtual y todo tipo de otros trucos.
Además, una constante de puntero nulo suele ser siempre la misma en cada instancia de un programa (sinceramente, no conozco una plataforma en la que varíe de ejecución a ejecución). Entonces, si en ambos programas, imprime NULL
, incluso se espera que los resultados sean idénticos.
Ahora en la pregunta, usted está preguntando sobre la impresión de esos indicadores, que es algo completamente diferente:
Cuando dos programas se ejecutan al mismo tiempo e imprime la dirección a la que apunta el puntero, ¿puede suceder que ambos programas impriman el mismo valor?
Como esto está etiquetado con c
, lo responderé desde un punto de vista C:
Sí. Suponiendo que haya querido printf("%p", (void *)thePointer)
, es perfectamente posible. El especificador de conversión %p
formatea el puntero de una manera definida por la implementación. Además, si está imprimiendo como un número entero después de haber hecho la conversión de tipo adecuada, nuevamente, el resultado de la conversión está definido por la implementación. Por lo tanto, su programa siempre puede imprimir 0xffffffff
o foobar
o why are you even curious of internals like a pointer''s value
cada vez que intenta imprimir un puntero. Entonces, sí, es posible que los dos programas tengan el mismo resultado.
En sistemas operativos como Linux, un programa en ejecución se denomina process . Cada proceso tiene su propio espacio de direcciones y usa memoria virtual . Entonces, la misma dirección 0x12345
generalmente se refiere a diferentes celdas de memoria en el proceso A y en el proceso B.
Lea la Programación avanzada de Linux que tiene algunos capítulos que explican eso (desde una perspectiva de Linux). Consulte también llamadas al sistema de horquillas y lea las páginas de manual de fork(2) , mmap(2) , execve(2) .
Otros sistemas operativos (Windows, MacOSX) también tienen procesos que se ejecutan en su propio espacio de direcciones individuales usando memoria virtual.
Los detalles pueden ser bastante complejos (y en realidad, algunos RAM pueden compartirse entre procesos ...). Lea sobre copiar en escritura , memoria compartida , etc.
Lea también un buen libro acerca de los sistemas operativos , por ejemplo, Tanenbaum''s libro Tanenbaum''s , o los sistemas operativos: Three Easy Pieces (descarga gratuita en línea).
Sí, puede suceder El programa se ejecuta en la memoria virtual. Si un proceso comienza a ejecutarse, se crea un process address space
para cada proceso. No solo 2 procesos, múltiples procesos pueden tener la misma dirección cuando se imprimen.
https://.com/a/18479996/1814023 mostrará cómo se verá un espacio de direcciones de proceso ... Y cada proceso tiene una copia similar asignada por el sistema operativo.
Sí. El programa se ejecuta en una memoria virtual asignada por el sistema operativo. La cantidad de memoria virtual está determinada por la arquitectura del procesador.
La dirección que ve se refiere a la dirección de la memoria virtual y no a la dirección física de la RAM.
Añadiría que cada proceso que se ejecuta en un sistema obtiene un gran espacio de direcciones (2 ^ 32 en un sistema operativo de 32 bits y 2 ^ 64 en un sistema operativo de 64 bits) asignado a él. Es en este espacio de direcciones virtuales que se ejecuta un proceso.
Si desea hacer esto, puede usar la memoria compartida entre dos procesos.