Page 94

2.1 Vectores est´aticos | w[-1] | 3221222636 | 3 | | v[-5] | 3221222636 | 3 | +--------+----------------------+-------+

La salida es una tabla con tres columnas: en la primera se indica el objeto que se est´a estudiando, la segunda corresponde a la direcci´on de memoria de dicho objeto4 y la tercera muestra el valor almacenado en dicho objeto. A la vista de las direcciones de memoria de los objetos i, v[0], v[1], v[2], w[0], w[1] y w[2], el compilador ha reservado la memoria de estas variables as´ı: 3221222636: 3221222640: 3221222644: 3221222648: 3221222652: 3221222656: 3221222660: 3221222664:

3 10 11 12

i w[0] w[1] w[2]

0 1 2

v[0] v[1] v[2]

F´ıjate en que las seis u ´ltimas filas de la tabla corresponden a accesos a v y w con ´ındices fuera de rango. Cuando trat´ abamos de acceder a un elemento inexistente en una lista Python, el int´erprete generaba un error de tipo (error de ´ındice). Ante una situaci´on similar, C no detecta error alguno. ¿Qu´e hace, pues? Aplica la f´ormula de indexaci´on, sin m´as. Estudiemos con calma el primer caso extra˜ no: v[-2]. C lo interpreta como: ((acceder al valor almacenado en la direcci´ on que resulta de sumar 3221222656 (que es donde empieza el vector v) a (−2) × 4 (−2 es el ´ındice del vector y 4 es tama˜ no de un int))). Haz el c´alculo: el resultado es 3221222648. . . ¡la misma direcci´ on de memoria que ocupa el valor de w[2]! Esa es la raz´on de que se muestre el valor 12. En la ejecuci´ on del programa, v[-2] y w[2] son exactamente lo mismo. Encuentra t´ u mismo una explicaci´ on para los restantes accesos il´ıcitos. ¡Ojo! Que se pueda hacer no significa que sea aconsejable hacerlo. En absoluto. Es m´as: debes evitar acceder a elementos con ´ındices de vector fuera de rango. Si no conviene hacer algo as´ı, ¿por qu´e no comprueba C si el ´ındice est´a en el rango correcto antes de acceder a los elementos y, en caso contrario, nos se˜ nala un error? Por eficiencia. Un programa que maneje vectores acceder´ a a sus elementos, muy probablemente, en numerosas ocasiones. Si se ha de comprobar si el ´ındice est´ a en el rango de valores v´alidos, cada acceso se penalizar´a con un par de comparaciones y el programa se ejecutar´a m´as lentamente. C sacrifica seguridad por velocidad, de ah´ı que tenga cierta fama (justificad´ısma) de lenguaje ((peligroso)).

2.1.8.

Asignaci´ on y copia de vectores

Este programa pretende copiar un vector en otro, pero es incorrecto: copia vectores mal.c 1

E copia vectores mal.c E

#define TALLA 10

2 3 4 5 6

int main(void) { int original [TALLA] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} ; int copia[TALLA];

7

copia = original ;

8 9

return 0;

10 11

}

4 Si ejecutas el programa en tu ordenador, es probable que obtengas valores distintos para las direcciones de memoria. Es normal: en cada ordenador y con cada ejecuci´ on se puede reservar una zona de memoria distinta para los datos.

88

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c