Ver Mensaje Individual
  #32 (permalink)  
Antiguo 15/08/2006, 20:42
Avatar de Instru
Instru
 
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
(Continuacion)

2)Sobrepasar la memoria apartada ya sea por puntero o por arreglo.

Otro error comun incluso en programadores expertos es este, usar memoria que esta mas alla de la apartada. Este error generalmente es de 2 tipos:
-Por arreglos estatico
-Por arreglos dinamicos o punteros.

Un ejemplo por arreglos estaticos:

int array[5];
int i;

for(i=0; i<=5; i++)
{
array[i]=i;
}

A simplem vista este programa parece correcto, incluso para programadores expertos es dificil encontrar estos tipos de errores. ¿Cuál es el error?
Estas sobrepasando los 5 espacios de memoria de el arreglo.
Como el 0 tambien cuenta como espacio de memoria, esto haria 5 localidades de la siguiente manera:

0- 1- 2- 3- 4
l1- l2- l3- l4- l5

l1=localidad1
l2=localidad2
.
.
etc...

Entonces el problems es el "<<B>=</B>5, porque esto significa que tambien modificara la localida 6!
La forma de corregirlos es la siguiente:

int array[5];
int i;

for(i=0; i<5; i++)
{
array[i]=i;
}

En conclusion, al declarar una rreglo estatico, el numero de valores que tendra sera el especificado menos 1 empezando del 0:

char array[256];
va desde 0 hasta 255(que en realidad son 256 valores).

Este error es sencillo, ya que es para fines explicativos, pero hay veces que en proyectos mas grandes los errores son mucho mas dificles de encontrar porque no tenemos el valor implicito. Un ejemplo sencillo de esto:

int array[10];
int val;

scanf("%d", &val);
array[val]=1;

Igual, el error es invisible practicamente. De hecho este programa no tiene error. Es totalmente correcto siempre y cuando el usuaro no meta valores iguales o mayores a 10.

Si el usurio mete un valor 55 por ejemplo, entonces estamos escribienndo mas alla de los limites permitidos. Como veran este error es mucho mas dificil de corregir, ya que aveces puede no fallar y aveces puede fallar. Y peor aun, este tipo de errores "confunde" a los depuradores mas potentes ya que al escribir en memoria fuera del limite, puede que cambies el valor de una de tus propias variables y el depurador te dice que el valor cambió y tu no puedes saber porque ya que este cambio es "de repente", sin asignacion alguna. Como dije, este tipo de error es de los mas comunes, mas dificiles de depurar y tediosos. Siempre es recomendable tener un control sobre las direcciones que un punero puede tener:

int array[10];
int val;

scanf("%d", &val);
if(val>=10)
{
printf("Escriba un valor menor a 10\n");
exit(0);
}
array[val]=1;

Esto aunque aparentemente no va a dar mas problemas no es muy recomendable, ya que esto es lo que se llama "trabajar con punteros de manera peligrosa". Hay que evitar lo peligroso de los punteros a toda costa para asi no tener que esar depurando programas que cambian valores de sus variables espontaneamente o incluso desestabilizar el sistema.

(Continua)