Declarar dos variables llamadas a
ciertamente es un error; si tu compilador acepta eso, entonces está roto. Supongo que quiere decir que aún no obtiene un error si reemplaza una declaración con la otra.
El acceso al array no está controlado por rango. En tiempo de compilación, el tamaño de una matriz a menudo no se conoce, y el idioma no requiere una comprobación, incluso cuando lo es. En tiempo de ejecución, un cheque podría degradar el rendimiento, lo que iría en contra de la filosofía C++ de no pagar por algo que no necesita. Entonces, el acceso más allá del final de una matriz proporciona un comportamiento indefinido, y depende del programador asegurarse de que no suceda.
A veces, un acceso no válido causará un error de segmentación, pero esto no está garantizado. Por lo general, la protección de memoria solo se aplica a páginas completas de memoria, con un tamaño de página típico de algunos kilobytes. Cualquier acceso dentro de una página de memoria válida no será capturado. Hay muchas posibilidades de que la memoria a la que accedes contenga alguna otra variable de programa, o parte de la pila de llamadas, por lo que escribir allí podría afectar el comportamiento del programa de cualquier forma que puedas imaginar.
Si quiere estar seguro, puede usar std::vector
, y solo acceder a sus elementos usando su función at()
. Esto verificará el índice y arrojará una excepción si está fuera de rango. También administrará la asignación de memoria para usted, corrigiendo la pérdida de memoria en su ejemplo.
Desafortunadamente, el comportamiento definido ** a veces ** es un subconjunto de comportamiento indefinido :( – Mahesh
@Mahesh :)) no. –
@LuchianGrigore ** A veces ** – Mahesh