Page 95

2 Estructuras de datos en C: vectores est´aticos y registros

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

Violaci´ on de segmento Los errores de acceso a zonas de memoria no reservada se cuentan entre los peores. En el ejemplo, hemos accedido a la zona de memoria de un vector sali´endonos del rango de indexaci´ on v´ alido de otro, lo cual ha producido resultados desconcertantes. Pero podr´ıa habernos ido a´ un peor: si tratas de escribir en una zona de memoria que no pertenece a ninguna de tus variables, cosa que puedes hacer asignando un valor a un elemento de vector fuera de rango, es posible que se genere una excepci´ on durante la ejecuci´ on del programa: intentar escribir en una zona de memoria que no ha sido asignada a nuestro proceso dispara, en Unix, una se˜ nal de ((violaci´ on de segmento)) (segmentation violation) que provoca la inmediata finalizaci´ on de la ejecuci´ on del programa. F´ıjate en este programa:

E violacion.c E

violacion.c 1

#include <stdio.h>

2 3 4 5

int main(void) { int a[10];

6

a[10000] = 1;

7 8

return 0;

9 10

}

Cuando lo ejecutamos en un ordenador bajo Unix, obtenemos este mensaje por pantalla: Violaci´ on de segmento El programa ha finalizado abruptamente al ejecutar la asignaci´ on de la l´ınea 7. Estos errores en la gesti´ on de memoria se manifiestan de formas muy variadas: pueden producir resultados extra˜ nos, finalizar la ejecuci´ on incorrectamente o incluso bloquear al computador. ¿Bloquear al computador? S´ı, en sistemas operativos poco robustos, como Microsoft Windows, el ordenador puede quedarse bloqueado. (Probablemente has experimentado la sensaci´ on usando algunos programas comerciales en el entorno Microsoft Windows.) Ello se debe a que ciertas zonas de memoria deber´ıan estar fuera del alcance de los programas de usuario y el sistema operativo deber´ıa prohibir accesos il´ıcitos. Unix mata al proceso que intenta efectuar accesos il´ıcitos (de ah´ı que terminen con mensajes como ((Violaci´ on de segmento))). Microsoft Windows no tiene la precauci´ on de protegerlas, as´ı que las consecuencias son mucho peores. Pero casi lo peor es que tu programa puede funcionar mal en unas ocasiones y bien en otras. El hecho de que el programa pueda funcionar mal algunas veces y bien el resto es peligros´ısimo: como los errores pueden no manifestarse durante el desarrollo del programa, cabe la posibilidad de que no los detectes. Nada peor que dar por bueno un programa que, en realidad, es incorrecto. Tenlo siempre presente: la gesti´ on de vectores obliga a estar siempre pendiente de no rebasar la zona de memoria reservada.

Si compilas el programa, obtendr´ as un error en la l´ınea 8 que te impedir´a obtener un ejecutable: ((incompatible types in assignment)). El mensaje de error nos indica que no es posible efectuar asignaciones entre tipos vectoriales. Nuestra intenci´ on era que antes de ejecutar la l´ınea 8, la memoria presentara este aspecto: 0

original

1

2

3

4

5

6

7

8

9

1 2 3 4 5 6 7 8 9 10 0

1

2

3

4

5

6

7

8

9

copia y, una vez ejecutada la l´ınea 8 llegar a una de estas dos situaciones: 1. obtener en copia una copia del contenido de original : Introducci´ on a la Programaci´ on con C

89

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement