¿Está comiendo memoria mi compilador?

Iniciado por furciorifa, 3 Febrero 2016, 06:23 AM

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

furciorifa

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 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

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
#include<stdio.h>

int main(){
                int i;
               
                int a[5]={1,2,3,4,5};

                a[5]=6;

                for(i=0;i<=5;i++){
                        printf("%d\n",a[i]);
                }
                return 0;
        }






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.



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?

MAFUS

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.

Orubatosu

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
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998