elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Asignar memoria con malloc() en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Asignar memoria con malloc() en C  (Leído 2,803 veces)
nullx100

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Asignar memoria con malloc() en C
« 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.


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Asignar memoria con malloc() en C
« Respuesta #1 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.


En línea

nullx100

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Re: Asignar memoria con malloc() en C
« Respuesta #2 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?
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Asignar memoria con malloc() en C
« Respuesta #3 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).
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Asignar Mas Memoria A Un Arreglo Dinamico
Programación C/C++
Omar_2013 4 2,975 Último mensaje 2 Septiembre 2013, 23:26 pm
por Omar_2013
[C] Memoria dinámica. Malloc, Realloc
Programación C/C++
GGZ 1 2,894 Último mensaje 19 Noviembre 2015, 01:44 am
por GGZ
Asignar memoria dinamicamente en C
Programación C/C++
fullanitox 3 2,215 Último mensaje 15 Marzo 2016, 04:18 am
por furciorifa
Liberar memoria asignada con malloc, después de salir de la función [C].
Programación C/C++
NOB2014 8 3,352 Último mensaje 28 Abril 2016, 04:28 am
por HardForo
Lista Enlazada - asignar memoria
Programación C/C++
LadyWin 1 2,928 Último mensaje 31 Julio 2021, 12:10 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines