Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: nullx100 en 17 Abril 2022, 19:46 pm



Título: Asignar memoria con malloc() en C
Publicado por: nullx100 en 17 Abril 2022, 19:46 pm
Hola.

Entiendo que las diferentes variables dependiendo del tipo y desde donde se estén declarando se guardan en un segmento de memoria o en otro.

Corregidme si me equivoco

[Direcciones más pequeñas]
--
.text (Para instrucciones)
.data (Para variables globales y estáticas inicializadas)
.bss (Para variables globales y estáticas no inicializadas)
.heap (Uso libre para el programador. Crece hacia direcciones más altas)
.stack (Para guardar el contexto de función, variables locales, parámetros y dirección de retorno para el EIP. Crece en direcciones más pequeñas)
--
[Direcciones más altas]

He creado el siguiente codigo:

Código:

#include <stdio.h&gt;
#include <stdlib.h&gt;

int global_var; //.bss
int global_initialized_var = 5; //.data

void function(){
int stack_var; //Se metera en la pila.
printf("The function's stack_var is at address %p\n", &stack_var);
}

int main(){
int stack_var; // en la pila
static int static_initialized_var = 5; //en .data
static int static_var; //.bss
int *heap_var_ptr; //.heap
heap_var_ptr = (int *) malloc(4);

//.data segment
printf(".data segment\n");
printf("global_initialized_var is at address %p\n", &global_initialized_var);
printf("static_initialized_var is at address %p\n", &static_initialized_var);

//.bss segment
printf(".bss segment\n");
printf("static_var is at address %p\n", &static_var);
printf("global_var is at address %p\n", &global_var);

//.heap segment
printf(".heap segment\n");
printf("heap_var_ptr is at addres %p\n",heap_var_ptr);

//.stack segment
printf(".stack segment\n");
printf("stack_var is at address %p\n", &stack_var);
function();
}


y la salida es la siguiente:

Código:

.data segment
global_initialized_var is at address 0x804a028
static_initialized_var is at address 0x804a02c
.bss segment
static_var is at address 0x804a034
global_var is at address 0x804a038
.heap segment
heap_var_ptr is at addres 0xbfe204e8
.stack segment
stack_var is at address 0xbfe204e4
The function's stack_var is at address 0xbfe204c8


Lo que me extraña es la variable heap_var_ptr, no es raro que este a solo 4 bytes de la de stack_var?? Me da la impresión de que esta variable se está quedando en el segmento de pila en vez de en el de heap cosa que vería normal si fuera otro tipo de variable, ya que está dentro de la función main() pero al usar malloc() me parece raro que no esté en otra dirección de memoria más baja.

Gracias de antemano.


Título: Re: Asignar memoria con malloc() en C
Publicado por: MAFUS en 17 Abril 2022, 21:38 pm
Cuidado con ese malloc(4)

A mi me da
Código:
.data segment
global_initialized_var is at address 0000000000403010
static_initialized_var is at address 0000000000403014
.bss segment
static_var is at address 0000000000407030
global_var is at address 0000000000407970
.heap segment
heap_var_ptr is at addres 0000000000766960
.stack segment
stack_var is at address 000000000061FE14
The function's stack_var is at address 000000000061FDDC

Ya ves que la stack, al menos en mi máquina, está lejos del heap.


Título: Re: Asignar memoria con malloc() en C
Publicado por: nullx100 en 17 Abril 2022, 22:10 pm
Gracias por tu respuesta MAFUS, ya veo que en tu caso si que parece estar usando el segmento heap.

El programa lo ejecuto en Ubuntu 32 bits con gcc para compilarlo.

¿A que te refieres con "Cuidado con ese malloc(4)"? No está siendo utilizado de la forma correcta?


Título: Re: Asignar memoria con malloc() en C
Publicado por: MAFUS en 17 Abril 2022, 23:42 pm
No, no está siendo utilizado de forma correcta. int no tiene un número de bits definido y depende de la implementación. Suponer que es de 4 bytes sólo va a hacer que el código funcione en máquinas que usen ints de 4 bytes. Mejor si usas sizeof(int).