Prerrequisito: Arrays en C/C++
En lenguajes de alto nivel como Java, hay funciones que le impiden acceder a la array fuera de los límites generando una excepción como java.lang.ArrayIndexOutOfBoundsException. Pero en el caso de C, no existe tal funcionalidad, por lo que el programador debe encargarse de esta situación.
¿Qué sucede si el programador accede accidentalmente a cualquier índice de array que esté fuera de límite?
C no proporciona ninguna especificación que se ocupe del problema de acceder a un índice no válido. Según el estándar ISO C, se llama Comportamiento indefinido .
Un comportamiento indefinido (UB) es el resultado de ejecutar un código de computadora cuyo comportamiento no está prescrito por la especificación del lenguaje a la que se puede adherir el código, para el estado actual del programa (por ejemplo, memoria). Esto generalmente sucede cuando el traductor del código fuente hace ciertas suposiciones, pero estas suposiciones no se cumplen durante la ejecución.
Ejemplos de comportamiento indefinido al acceder a una array fuera de los límites
- Acceder a una ubicación de memoria no asignada: el programa puede acceder a alguna parte de la memoria que le pertenece.
// Program to demonstrate
// accessing array out of bounds
#include <stdio.h>
int
main()
{
int
arr[] = {1,2,3,4,5};
printf
(
"arr [0] is %d\n"
, arr[0]);
// arr[10] is out of bound
printf
(
"arr[10] is %d\n"
, arr[10]);
return
0;
}
Producción :
arr [0] is 1 arr[10] is -1786647872
Se puede observar aquí que arr[10] está accediendo a una ubicación de memoria que contiene un valor basura.
- Fallo de segmentación: el programa puede acceder a alguna parte de la memoria que no le pertenece, lo que puede provocar el bloqueo del programa, como un fallo de segmentación.
// Program to demonstrate
// accessing array out of bounds
#include <stdio.h>
int
main()
{
int
arr[] = {1,2,3,4,5};
printf
(
"arr [0] is %d\n"
,arr[0]);
printf
(
"arr[10] is %d\n"
,arr[10]);
// allocation memory to out of bound
// element
arr[10] = 11;
printf
(
"arr[10] is %d\n"
,arr[10]);
return
0;
}
Salida:
error de tiempo de ejecución: falla de segmentación (SIGSEGV)
Puntos importantes:
- Manténgase dentro de los límites de la array en la programación C mientras usa arrays para evitar tales errores.
- Sin embargo, C++ ofrece la plantilla de clase std::vector , que no requiere realizar la verificación de límites. Un vector también tiene la función miembro std::at() que puede realizar una verificación de límites.
Este artículo es una contribución de Mandeep Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA