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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  La memoria no se inicializa en cero de Forma Automatica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: La memoria no se inicializa en cero de Forma Automatica  (Leído 3,101 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
La memoria no se inicializa en cero de Forma Automatica
« en: 8 Agosto 2016, 04:24 am »

Repitan despues de mi...

La memoria no se inicializa en 0 de forma automatica.
Los arreglos no se inicializan en 0 de forma automatica.
Las variables no se inicializan en 0 de forma automatica.

Se que es un tema tanto repetitivo y es el causante de muchos errores de programacion.

No existe ninguna garantia de que la memoria este inicializada en 0 todas las veces, hay ocasiones en la que si lo esta y hay ocasiones en la que no esta veamos este ejemplo, el cual muestra de un arreglo de 20 elementos los que su valor inicial no sea 0,

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. int i;
  5. int arreglo[20];
  6. i = 0;
  7. while(i < 20) {
  8. if(arreglo[i] != 0) {
  9. printf("La posicion %i del arreglo no esta inicializada su valor actual es %i\n",i,arreglo[i]);
  10. }
  11. i++;
  12. }
  13. return 0;
  14. }
  15.  
  16.  

La salida de ese codigo compilado con GCC para windows es:

Código:
La posicion 0 del arreglo no esta inicializada su valor actual es 4200160
La posicion 2 del arreglo no esta inicializada su valor actual es 21
La posicion 4 del arreglo no esta inicializada su valor actual es 9966448
La posicion 6 del arreglo no esta inicializada su valor actual es 1
La posicion 8 del arreglo no esta inicializada su valor actual es -1
La posicion 9 del arreglo no esta inicializada su valor actual es -1
La posicion 10 del arreglo no esta inicializada su valor actual es 4200261
La posicion 12 del arreglo no esta inicializada su valor actual es 1
La posicion 14 del arreglo no esta inicializada su valor actual es 4200137
La posicion 16 del arreglo no esta inicializada su valor actual es 3
La posicion 18 del arreglo no esta inicializada su valor actual es 21

Y la segunda vez que lo ejecute fue

Código:
La posicion 0 del arreglo no esta inicializada su valor actual es 4200160
La posicion 2 del arreglo no esta inicializada su valor actual es 21
La posicion 4 del arreglo no esta inicializada su valor actual es 12063600
La posicion 6 del arreglo no esta inicializada su valor actual es 1
La posicion 8 del arreglo no esta inicializada su valor actual es -1
La posicion 9 del arreglo no esta inicializada su valor actual es -1
La posicion 10 del arreglo no esta inicializada su valor actual es 4200261
La posicion 12 del arreglo no esta inicializada su valor actual es 1
La posicion 14 del arreglo no esta inicializada su valor actual es 4200137
La posicion 16 del arreglo no esta inicializada su valor actual es 3
La posicion 18 del arreglo no esta inicializada su valor actual es 21

Como ven algunos valores cambiaron y otros se mantiene similares..

Depende del programador inicializar la memoria correctamente, o por lo menos estar cociente de que es posible que tenga basura en la memoria.

Una forma de inicializar en 0 el arreglo mencioanado al momento de declararlo es:

Código
  1. int arreglo[20] = {0};

otra forma es utilizar las funciones para inicializar con X valor la memoria

Por ejemplo para inicializar con 0:

Código
  1. memset(arreglo,0,sizeof(int)*20);

Saludos!


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: La memoria no se inicializa en cero de Forma Automatica
« Respuesta #1 en: 8 Agosto 2016, 04:59 am »

Jajaja, por eso yo inicializo todo lo que puedo xD En C++ la cosa está más sencilla en las clases por los constructores, pero igualmente hay que inicializar siempre!! Háganle caso a AlbertoBSD, y se ahorrarán muchos disgustos


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
+ 1 Oculto(s)

Desconectado Desconectado

Mensajes: 298


un defecto se puede convertir en una virtud


Ver Perfil WWW
Re: La memoria no se inicializa en cero de Forma Automatica
« Respuesta #2 en: 11 Agosto 2016, 17:40 pm »

sucede lo mismo  con la clase vector? o list en java?
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: La memoria no se inicializa en cero de Forma Automatica
« Respuesta #3 en: 11 Agosto 2016, 18:41 pm »

No creo, estas clases tienen sus constructores y no puedes acceder a posiciones donde no se han inicializado con un valor.

El detalle radica en que cuando aprenden a programar nunca les enseñan a inicializar la memoria y luego vienen aqui a preguntar por que falla su codigo.

Saludos!


En línea

+ 1 Oculto(s)

Desconectado Desconectado

Mensajes: 298


un defecto se puede convertir en una virtud


Ver Perfil WWW
Re: La memoria no se inicializa en cero de Forma Automatica
« Respuesta #4 en: 11 Agosto 2016, 21:50 pm »

java ya es muy elaborado en ese aspecto

hice un copy paste hacia java

Código
  1. public class ElHackerForo {
  2.  
  3.  
  4. public static void main(String args[]) {
  5. int i;
  6. int arreglo[]=new int[20];
  7. i = 0;
  8. while(i < 20) {
  9. if(arreglo[i] != 0) {
  10. System.out.printf("La posicion %i del arreglo no esta inicializada su valor actual es %i\n",i,arreglo[i]);
  11. }
  12. i++;
  13. }
  14. }
  15.  
  16. }

el resultado es nada, es decir todos los numeros son ceros del arreglo


slds
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: La memoria no se inicializa en cero de Forma Automatica
« Respuesta #5 en: 12 Agosto 2016, 00:04 am »

Sin embargo, inicializarlo siempre a mansalva también es un problema de rendimiento.
Cada cosa en su momento.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: La memoria no se inicializa en cero de Forma Automatica
« Respuesta #6 en: 12 Agosto 2016, 00:38 am »

Claro obviamente no tenemos que abusar, por ejemplo si sabemos que siempre vamos a Inicializar "Y" posición de un arreglo X Antes de realizar cualquier tipo de operaciones con ella o de leerla, pues no hay necesidad de inicializar en 0 todo  el Arrglo X..

Por ejemplo tenia un Codigo de Grafos donde inicializaba en 0 todo un Nodo unos cuantos miles de millones veces, y el programa tardaba X cantidad de tiempo, posteriormente lo hacia con memoria SIN inicializar y el programa funcionaba hasta 4 veces mas rápido y claro solo Leia Datos una vez que sabia que ya habían sido inicializados correctamente.

El tema lo publique por qu hay usuarios que no están cocientes de que la memoria puede tener basura y luego vienen aqui a preguntar por que su programa falla, o veces hace "ciertas" cosas y a veces no las hace..

En fin.

Saludos!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mozilla actualizará de forma automática la versión de Firefox 3.6
Noticias
wolfbcn 0 1,333 Último mensaje 29 Abril 2012, 13:16 pm
por wolfbcn
[Batch] Copiar de forma automatica carpeta a pen
Scripting
ricki74 3 2,942 Último mensaje 28 Mayo 2012, 04:26 am
por Eleкtro
Presionar teclas de forma automatica
Programación General
daryl09 2 6,284 Último mensaje 12 Diciembre 2013, 17:36 pm
por Platanito Mx
Llenar formularios de forma automática.
Desarrollo Web
0xFer 3 2,070 Último mensaje 24 Febrero 2017, 14:55 pm
por dato000
En Japón han desarrollado una técnica para colorear el anime de forma automática
Noticias
wolfbcn 0 811 Último mensaje 29 Noviembre 2018, 21:37 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines