Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: furciorifa en 3 Febrero 2016, 06:23 am



Título: ¿Está comiendo memoria mi compilador?
Publicado por: furciorifa en 3 Febrero 2016, 06:23 am
Hola a todos resulta que estaba dando clases de programación en C, pero nunca me había pasado esto, a la hora de explicar que un arreglo declarado como
Código
  1. arreglo[5]={1,2,3,4,5};
se asignaban 5 enteros al arreglo y no más y que la siguiente sentencia no podía ser válida

Código
  1. a[5]=6;
ya que estabas desbordando el arreglo,

en fin para no alargar las cosas más, hice esa asignación y corrí el siguiente código
Código
  1. #include<stdio.h>
  2.  
  3. int main(){
  4.                int i;
  5.  
  6.                int a[5]={1,2,3,4,5};
  7.  
  8.                a[5]=6;
  9.  
  10.                for(i=0;i<=5;i++){
  11.                        printf("%d\n",a[i]);
  12.                }
  13.                return 0;
  14.        }
  15.  
  16.  
  17.  
  18.  
  19.  

Resulta que compila sin errores e incluso corre, me salió el tiro por la culata a la hora de dar clases pues estaba cometiendo una equivocacíon y contradicción enorme en caso de que mi compilador fallase o yo mismo haya caído en algún fallo.

(http://i.imgur.com/tqK9QPB.png)

Resulta que lo corrí en la máquina de un alumno con otro compilador y me arrojaba el error que yo quería demostrar en clase, habrá algún modo de saber si es correcto o incorrecto? o tendré que reinstalar gcc?


Título: Re: ¿Está comiendo memoria mi compilador?
Publicado por: MAFUS en 3 Febrero 2016, 06:59 am
C no controla los límites de los arrays y deja escribir en cualquier parte de la memoria, deja esa tarea al programador; parte de su velocidad viene de que no realiza estos chequeos.
Ahora bien, puede haber compiladores que hagan esta comprobación,  pero esto ya es funcionalidad añadida.
El sistema operativo también será tu perro guardián impidiendo que puedasbescribir en zonas de memoria diferentes a la memoria dedatos que ha asignado a tu programa.


Título: Re: ¿Está comiendo memoria mi compilador?
Publicado por: Orubatosu en 3 Febrero 2016, 10:13 am
Como te han comentado, C y C++ no comprueban que escribes o intentas leer fuera de un rango. Las consecuencias de hacerlo pueden ser inocuas o el cuelgue del programa.

Hay que ser especialmente cuidadoso en estos temas, porque si escribes fuera de rango puedes sobreescribir un valor de otra variable, haciendo la depuración bastante mas compleja cuando el programa "no funciona como debe".

Esto en algunas estructuras de datos de C++ se soluciona usando iteradores, que son una seguridad adicional, pero es el programador quien debe en todo momento cuidarse de no leer o escribir "donde no debe", no el compilador