Page 253

4 Estructuras de datos: memoria din´amica

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

d->palabra[j] = malloc(strlen(d->palabra[j-1])+1)*sizeof (char)); strcpy(d->palabra[j], d->palabra[j-1]); free(d->palabra[j-1]);

20 21 22

} /* Y copiamos en su celda la nueva palabra */ d->palabra[i] = malloc( (strlen(pal )+1) * sizeof (char) ); strcpy(d->palabra[i], pal ); d->palabras++;

23 24 25 26 27 28

}

¡Buf! Las l´ıneas 20–22 no hacen m´ as que asignar a una palabra el contenido de otra (la que ocupa la posici´ on j recibe una copia del contenido de la que ocupa la posici´on j-1). ¿No hay una forma mejor de hacer eso mismo? S´ı. Transcribimos nuevamente las u ´ltimas l´ıneas del programa, pero con una sola sentencia que sustituye a las l´ıneas 20–22: ... for (j=d->palabras; j>i; i--) d->palabra[j] = d->palabra[j-1] ; /* Y copiamos en su celda la nueva palabra */ d->palabra[i] = malloc( (strlen(pal )+1) * sizeof (char) ); strcpy(d->palabra[i], pal ); d->palabras++;

18 19 20 21 22 23 24 25

}

No est´a mal, pero ¡no hemos pedido ni liberado memoria din´amica! ¡Ni siquiera hemos usado strcpy, y eso que dijimos que hab´ıa que usar esa funci´on para asignar una cadena a otra. ¿C´omo es posible? Antes hemos de comentar qu´e significa una asignaci´on como ´esta: 1

d->palabra[j] = d->palabra[j-1];

Significa que d->palabra[j] apunta al mismo lugar al que apunta d->palabra[j-1]. ¿Por qu´e? Porque un puntero no es m´ as que una direcci´on de memoria y asignar a un puntero el valor de otro hace que ambos contengan la misma direcci´on de memoria, es decir, que ambos apunten al mismo lugar. Veamos qu´e pasa estudiando un ejemplo. Imagina un diccionario en el que ya hemos insertado las palabras ((anual)), ((dadivoso)), ((mano)) y ((taco)) y que vamos a insertar ahora la palabra ((feliz)). Partimos, pues, de esta situaci´ on: palabra 0

a n u a l \0

1

d a d i v o s o \0

2

m a n o \0

3

t a c o \0

palabras

4

Una vez hemos redimensionado el vector de palabras, tenemos esto: palabra 0

a n u a l \0

1

d a d i v o s o \0

2

m a n o \0

3

t a c o \0

palabras

4

4

La nueva palabra debe insertarse en la posici´on de ´ındice 2. El bucle ejecuta la asignaci´on d->palabra[j] = d->palabra[j-1] para j tomando los valores 4 y 3. Cuando se ejecuta la iteraci´on con j igual a 4, tenemos: Introducci´ on a la Programaci´ on con C

247

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement