¿Qué es la infracción de acceso a la memoria?

Segmento Descripción
Texto El segmento de texto incluye las instrucciones de programación, por ejemplo, el código de su programa
Datos Las variables y matrices que se definen cuando se compila / construye el programa, se almacenan en el segmento de datos
Apilar Aquí es donde se almacenan las variables temporales; los definidos en funciones y subrutinas del programa
Montón Las variables que tienen su memoria asignada durante el tiempo de ejecución se almacenan aquí. Los lenguajes como C / C ++ usan una función llamada malloc para asignar memoria; en Fortran se asigna.

Violaciones de acceso a la memoria

Ahora que hemos cubierto los conceptos básicos de la memoria y cómo la usan los programas, podemos volver a nuestro problema: cuando el programa intenta pensar, pero no pasa nada.

La falla de segmentación ocurrirá si uno de los tipos de variables enumerados anteriormente intenta acceder a la memoria fuera del segmento donde vive. También puede suceder si un segmento está configurado como de solo lectura. A todos nos ha pasado eso en nuestra vida diaria; intentando copiar o guardar archivos y son de solo lectura. Es el mismo concepto, solo la MEMORIA es de solo lectura y el programa no puede actualizar la variable.

Uno de los ejemplos más comunes de errores de memoria ocurre con las matrices. Una matriz es una única variable que puede contener varios depósitos. Piense en una lista para la lista inicial de un equipo de béisbol. Tendrá 9 cubos. Una vez que configure la matriz en su programa, habrá consecuencias si intenta escribir o acceder al décimo depósito. Recuerde: ¡Los programas comienzan a contar en CERO! Nuestro primer bateador es el bateador 0, el noveno es el bateador 8.

El siguiente fragmento de código muestra lo fácil que pueden ocurrir estos errores porque hemos intentado hacer referencia al noveno bateador. Tenemos 9 bateadores, ¿verdad? Sí, pero si contamos el primero como 0, ¡entonces 9 está fuera de rango!

Error de acceso a la memoria: matriz

Los punteros , que son variables que contienen una ubicación de memoria en lugar de un valor, pueden causar violaciones de acceso a la memoria. Los lenguajes como C / C ++ permiten el uso de punteros. Una función (por ejemplo, scanf ()) podría ser mal utilizada e intentar apuntar a una ubicación de memoria que no existe o es de solo lectura.

Prevención de violaciones de acceso a la memoria

A veces se producen errores porque la memoria del sistema no está a la altura (p. Ej., Ejecutar un juego masivo en una máquina Windows antigua). Sin embargo, muchas herramientas de programación tienen opciones para detectar estos errores. Los depuradores se pueden utilizar para ayudarlo a encontrar posibles errores. Los lenguajes como Java proporcionan una sintaxis para detectar posibles errores y no bloquear el programa (lo que se denomina declaraciones de prueba y captura). Otra buena práctica es la verificación de escritorio a la antigua: recorra cada línea de código con cuidado en papel. A veces perdemos cosas que son obvias cuando estamos en la pantalla de la computadora.

Resumen de la lección

Las violaciones de acceso a la memoria ocurren cuando un programa intenta actualizar o acceder a una dirección de memoria que no existe (o es inaccesible). La memoria se divide en segmentos: cuando una variable intenta acceder o actualizar la memoria fuera de su segmento, se producen violaciones de acceso a la memoria. Una infracción de acceso común ocurre con las matrices: intentar actualizar un depósito de matrices que no existe. Los punteros , variables que almacenan direcciones de memoria, también pueden causar errores, ya que pueden terminar fácilmente apuntando a direcciones que no existen. Los depuradores, la sintaxis (como el try and catch de Java) y los recorridos de código manual pueden ayudar a prevenir estos errores.