La memoria no se inicializa en cero de Forma Automatica

Iniciado por AlbertoBSD, 8 Agosto 2016, 04:24 AM

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

AlbertoBSD

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,

#include<stdio.h>

int main() {
int i;
int arreglo[20];
i = 0;
while(i < 20) {
if(arreglo[i] != 0) {
printf("La posicion %i del arreglo no esta inicializada su valor actual es %i\n",i,arreglo[i]);
}
i++;
}
return 0;
}



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


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

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:

int arreglo[20] = {0};

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

Por ejemplo para inicializar con 0:

memset(arreglo,0,sizeof(int)*20);

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

class_OpenGL

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

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

+ 1 Oculto(s)

sucede lo mismo  con la clase vector? o list en java?

AlbertoBSD

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!


Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

+ 1 Oculto(s)

java ya es muy elaborado en ese aspecto

hice un copy paste hacia java

Código (java) [Seleccionar]
public class ElHackerForo {

   
public static void main(String args[]) {
int i;
int arreglo[]=new int[20];
i = 0;
while(i < 20) {
if(arreglo[i] != 0) {
System.out.printf("La posicion %i del arreglo no esta inicializada su valor actual es %i\n",i,arreglo[i]);
}
i++;
}
}
   
}


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


slds

ivancea96

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

AlbertoBSD

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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW