Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

194
Vistas
static int arr[10] la dirección de memoria siempre termina en 060

Tengo un programa de CA que se ve así

C Principal

 #include <stdio.h> #define SOME_VAR 10 static int heap[SOME_VAR]; int main(void) { printf("%p", heap); return 0; }

y genera esto cuando ejecuto el programa compilado varias veces

 0x58aa7c49060 0x56555644060 0x2f8d1f8e060 0x92f58280060 0x59551c53060 0xd474ed6e060 0x767c4561060 0xf515aeda060 0xbe62367e060

¿Por qué siempre termina en 060? ¿Y la matriz está almacenada en el montón?

Editar: estoy en Linux y tengo ASLR activado. Compilé el programa usando gcc

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Las direcciones difieren debido a ASLR (radomización del diseño del espacio de direcciones). Usando esto, el binario se puede mapear en diferentes ubicaciones en el espacio de direcciones virtuales.

El heap de variables, en contraste con su nombre, no se encuentra en el montón, sino en el bss . Por lo tanto, el desplazamiento en el espacio de direcciones es constante.

Las páginas se asignan con granularidad de página, que es de 4096 bytes (hexadecimal: 0x1000) en muchas plataformas. Esta es la razón por la que los últimos tres dígitos hexadecimales de la dirección son los mismos.

Cuando hizo lo mismo con una variable de pila , la dirección podría incluso variar en los últimos dígitos en algunas plataformas (a saber, Linux con núcleos recientes), porque la pila no solo se asigna a otro lugar, sino que también recibe una compensación aleatoria al inicio.

over 4 years ago · Santiago Trujillo Denunciar

0

Si está utilizando Windows, el motivo es la estructura PE .

Su variable de heap se almacena en la sección .data del archivo y su dirección se calcula en función del inicio de esta sección. Cada sección se carga en una dirección de forma independiente, pero su dirección inicial es múltiplo del tamaño de la página. Debido a que no tiene otras variables, su dirección probablemente sea el inicio de la sección .data , por lo que su dirección será múltiplo del tamaño de la porción.

Por ejemplo, esta es la tabla de la versión compilada de Windows de su código: secciones La sección .text es donde está su código compilado y .data contiene su variable de heap . Cuando su PE se carga en la memoria, las secciones se cargan en direcciones diferentes y VirtualAlloc() las devuelve y serán múltiplos del tamaño de la página. Pero la dirección de cada variable es relativa al inicio de la sección que ahora tiene el tamaño de una página. Por lo tanto, siempre verá un número fijo en los dígitos inferiores. Dado que la dirección relativa del heap desde el inicio de la sección se basa en el compilador, las opciones de compilación, etc., verá un número diferente del mismo código pero compiladores diferentes, pero cada vez que se imprima se corrige.

Cuando compilo el código, noté que el heap se coloca en 0x8B0 bytes después del inicio de la sección .data . Entonces, cada vez que ejecuto este código, mi dirección termina en 0x8B0 .

over 4 years ago · Santiago Trujillo Denunciar

0

El compilador colocó un heap en el desplazamiento de 0x60 bytes en un segmento de datos que tiene, posiblemente porque el compilador tiene otras cosas en los primeros 0x60 bytes, como los datos utilizados por el código que inicia la rutina main . Por eso ves “060”; está justo donde estaba, y no tiene gran significado.

La aleatorización del diseño del espacio de direcciones cambia las direcciones base utilizadas para varias partes de la memoria del programa, pero siempre lo hace en unidades de 0x1000 bytes (porque esto evita causar problemas con la alineación y otros problemas). Entonces ve que las direcciones fluctúan en múltiplos de 0x1000, pero los últimos tres dígitos no cambian.

La definición static int heap[SOME_VAR]; define el heap con la duración del almacenamiento estático. Las implementaciones típicas de C lo almacenan en una sección de datos generales, no en el montón. El "montón" es un nombre inapropiado para la memoria que se usa para la asignación dinámica. (Es un nombre inapropiado porque las implementaciones de malloc pueden usar una variedad de estructuras de datos y algoritmos, sin limitarse a montones. Incluso pueden usar varios métodos en una implementación).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda