Junio 23, 2018, 01:58:53 pm

Autor Tema: Memoria dinámica en lenguaje C.  (Leído 3542 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Memoria dinámica en lenguaje C.
« en: Mayo 05, 2016, 04:37:43 pm »
Hola, gente:
Lo que me trae me tiene un poco desconcertado, en todos lados se lee que hay que tener cuidado al utilizar memoria dinámica porque te podes quedar sin memoria. -
El programa que dejo a continuación permite guardar en el montón 10.000.000 de enteros, les pregunto ¿cuanta más memoria se puede necesitar para cualquier programa que 10.000.000 de enteros? Además, lo prebe más de una vez y el programa no reventó. -

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <stdlib.h>

int main ( void ){
size_t contador = 0, i;
int* numeros = NULL;
int* mas_numeros = NULL;

for( i = 0; i < 10000000; i++ ){
contador++;
mas_numeros = (int*)realloc( numeros, contador * sizeof(int) );

if( mas_numeros!=NULL ){
numeros=mas_numeros;
numeros[contador-1] = i;
printf( "%7d ",numeros[i] );
if( i % 5 == 0 )
printf( "\n" );
}
else{
free( numeros );
printf( "\n No hay suficiente memoria" );
exit(1);
}
}

free (numeros);

return 0;
}


Es todo, desde ya muchas gracias.-
Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado HolyKnight

  • Elprince
  • G#
  • **
  • Mensajes: 2178
  • Sexo: Masculino
  • chgb ry dhr yrr
    • Ver Perfil
    • Holyknight's Web
Re:Memoria dinámica en lenguaje C.
« Respuesta #1 en: Mayo 06, 2016, 02:02:36 am »
En los sistemas modernos es bastante complicado quedarte sin memoria con un programa simple. Es bastante probable que llegues al limite de los int mucho antes de quedarte sin memoria (unos dosmil millones para sistemas de 32 bits). Teniendo en cuenta que los sistemas actuales no tienen menos de 4gb de ram y que además todos usan memoria virtual es practicamente imposible quedarte sin memoria. Lo que si puede pasar es que uses mallocs y callocs sin hacer los correspondientes free's cuando terminas de usar esa información y entonces produzcas un "memory leak" que te deje sin memoria o que consuma gran parte de ella. Si manejas bien las instrucciones de memoria dinámica no tendría que haber ningún problema de falta de memoria.
Aún así la memoria estática es mucho más rapida que la dinámica, por lo que siempre que sea posible deberías usar memoria estática.

Saludos.
You are not allowed to view links. Register or Login

"Todo el mundo desea saber, pero nadie quiere pagar el precio."

I was blind, but now i see.

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:Memoria dinámica en lenguaje C.
« Respuesta #2 en: Mayo 06, 2016, 05:59:08 am »
Hola, HolyKnight.
Muchas gracias por ocuparte, voy a tener muy en cuenta tus consejos. -

Saludos.
Daniel

Desconectado seth

  • El mas real
  • G#
  • **
  • Mensajes: 7936
  • Sexo: Masculino
    • Ver Perfil
Re:Memoria dinámica en lenguaje C.
« Respuesta #3 en: Mayo 06, 2016, 04:12:55 pm »
Hay aplicaciones que manejan muchos mas datos. Imaginate, por ejemplo, el padron electoral. En argentina somos 40 millones de personas y todos tenemos dni, direccion, nombre, apellido, fecha de nacimiento, escuela, mesa y foto.
Hace la cuenta de cuantos bytes podrian ser.

Ahora imaginate el sistema que lleva la cuenta de todas las ventas de carrefour. Cuantos items se venden por dia en todo el mundo?
Es probable que no esten todos los datos juntos y que nunca necesites tener todos en memoria a la vez, pero es claro que hay informacion para llenar mucha memoria.

Vamos por otro lado. Estas ejecutando un programa que lee un archivo y lo copia en memoria. Esperas que el archivo pese 200mb pero por un bug pesa 20G. Mientras lo estas leyendo en la pc de tu casa te quedas sin memoria

Otro mas. Estas corriendo un programa que carga algunos datos. A la vez estas corriendo un navegador que tiene abiertos un par de juegos flash. Si casi toda la ram la usa el navegador, tu programa se va a quedar sin memoria.

Podes tener swap, pero no siempre y si hay es muy lenta y puede ser que no te sirva.


Ves links a xd-blog.com.ar que no andan? buscalos en You are not allowed to view links. Register or Login

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:Memoria dinámica en lenguaje C.
« Respuesta #4 en: Mayo 07, 2016, 08:57:10 am »
Hola.
Gracia coterráneo por tu tiempo, muy importante tu aporte. -
Una consulta más, ¿es posible por medio de C enterarse cuanta memoria (en bytes) asigna el SO al montón en un determinado programa en tiempo de ejecución? -

Saludos.

Desconectado OnTheCore

  • Si te metes con CPH
    te metes conmigo
  • ****
  • Mensajes: 1610
  • Sexo: Masculino
    • Ver Perfil
Re:Memoria dinámica en lenguaje C.
« Respuesta #5 en: Mayo 07, 2016, 07:00:39 pm »
Depende el sistema operativo y la arquitectura. En el caso de Windows (no quiero hablar de linux porque nunca lo vi en profundidad, pero supongo que pasa lo mismo en arquitecturas x86 o x86_64) te deja usar toda la memoria direccionable. Es decir, en x86 podes redireccionar a 2^32, es decir, 4GB para cada programa. Hay algo que se llama paginación que divide la memoria en páginas y cuando se necesita RAM se guardan las páginas menos usadas en disco y si se vuelve a acceder a ellas se vuelven a cargar en memoria.
Esto no significa que si haces un malloc pidiendo 4GB te lo va a dar, ya que hay areas de memoria usadas para el stack, el heap, el código del programa en memoria y sus librerias, páginas que va a usar el kernel, estructuras de datos sobre el proceso cargado, etc. Malloc reserva lugar en el heap (podrías ver su tamaño).
El sistema no es tan tonto como para darte toda la ram a un proceso, sino que está simulando dartela toda. Además por cuestiones de seguridad y estabilidad, no todo ese espacio de direcciones va a estar cargado en RAM a la vez ni se le va a asignar todo el tiempo de CPU a un proceso.
Lo estoy explicando muy por encima esto, si te interesa googlealo.

TL;DR: Si reservas muchísima memoria no va a explotar el proceso. A lo sumo se pone todo un poquito mas lento. Si queres hacer explotar un proceso tenes que hacer cosas como divisiones por 0, escribir en regiones de memoria donde no tenes permiso de escritura, que sobreescribas otras cosas, etc.

Y si, podes obtener el tamaño del heap
No me mandes mensajes privados sobre troyanitos,  "crypters" o alguna otra boludez. No voy a ser tu maestro personal ni te voy a vender un curso para ser hacker. Si me envias un mensaje asi, probablemente no te guste la respuesta.

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:Memoria dinámica en lenguaje C.
« Respuesta #6 en: Mayo 07, 2016, 07:16:02 pm »
Hola.
Muy interesante lo que escribes. -
Citar
Y si, podes obtener el tamaño del heap
Hay alguna posibilidad que me des algún ejemplo de como lograrlo o alguna página donde pueda aprender como hacerlo. -

Un abrazo.

Desconectado OnTheCore

  • Si te metes con CPH
    te metes conmigo
  • ****
  • Mensajes: 1610
  • Sexo: Masculino
    • Ver Perfil
Re:Memoria dinámica en lenguaje C.
« Respuesta #7 en: Mayo 07, 2016, 09:57:10 pm »
You are not allowed to view links. Register or Login

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:Memoria dinámica en lenguaje C.
« Respuesta #8 en: Mayo 08, 2016, 08:04:51 am »
Hola.
Gracias por el aporte, lo voy a estudiar. -

Saludos.


resuelto
mi propio gets() con memoria dinamica

Iniciado por nano20sm

2 Respuestas
1328 Vistas
Último mensaje Agosto 16, 2013, 11:58:41 am
por nano20sm
question
Error memoria dinámica

Iniciado por jbgg

3 Respuestas
1008 Vistas
Último mensaje Enero 09, 2011, 12:29:35 pm
por jep
question
punteros y memoria dinámica

Iniciado por miserik

5 Respuestas
2467 Vistas
Último mensaje Diciembre 06, 2009, 11:57:37 pm
por WaesWaes
xx
ayuda programcion (memoria dinamica)

Iniciado por gosthxinito

1 Respuestas
1043 Vistas
Último mensaje ſeptiembre 02, 2008, 09:12:56 pm
por mycrox
resuelto
asignacion dinamica de memoria... (malloc, sizeof...)

Iniciado por ralymontes

5 Respuestas
3408 Vistas
Último mensaje Febrero 16, 2010, 04:36:15 pm
por ralymontes
xx
ampliar memoria de nokia 3220 con memoria usb conectada de alguna forma

Iniciado por spyderman

0 Respuestas
1655 Vistas
Último mensaje Junio 21, 2009, 10:39:21 am
por spyderman
xx
IP Dinamica

Iniciado por Gipr

2 Respuestas
1488 Vistas
Último mensaje Febrero 13, 2007, 11:55:05 pm
por evil_mind
xx
ip dinamica...

Iniciado por rimi777

5 Respuestas
1830 Vistas
Último mensaje Febrero 20, 2007, 02:50:36 am
por rimi777
xx
Ip dinamica??

Iniciado por TXIMI

3 Respuestas
1829 Vistas
Último mensaje Agosto 05, 2006, 04:17:40 am
por SaEK
xx
¿Que es la ip dinamica?

Iniciado por MAMILATINA*_*

2 Respuestas
2080 Vistas
Último mensaje Enero 18, 2007, 08:21:56 pm
por MAMILATINA*_*