Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 8 Agosto 2016, 04:24 am



Título: La memoria no se inicializa en cero de Forma Automatica
Publicado por: AlbertoBSD 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!


Título: Re: La memoria no se inicializa en cero de Forma Automatica
Publicado por: class_OpenGL 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


Título: Re: La memoria no se inicializa en cero de Forma Automatica
Publicado por: + 1 Oculto(s) en 11 Agosto 2016, 17:40 pm
sucede lo mismo  con la clase vector? o list en java?


Título: Re: La memoria no se inicializa en cero de Forma Automatica
Publicado por: AlbertoBSD 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!




Título: Re: La memoria no se inicializa en cero de Forma Automatica
Publicado por: + 1 Oculto(s) 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


Título: Re: La memoria no se inicializa en cero de Forma Automatica
Publicado por: ivancea96 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.


Título: Re: La memoria no se inicializa en cero de Forma Automatica
Publicado por: AlbertoBSD 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!