Sie sind auf Seite 1von 21

Asignacin dinmica de memoria y Estructuras dinmicas

Estructuras de datos

Asignacin dinmica de memoria


La asignacin dinmica de memoria se refiere a asignar memoria de acuerdo la vayamos necesitando.
Se hace uso de punteros o apuntador.

Punteros
Puntero: Variable que almacena una direccin de memoria. Se pueden tener apuntadores a cualquier tipo de variable.

Operadores
El operador unario o mondico & : Devuelve la direccin de memoria de una variable.
El operador de indireccin o de referencia * : Devuelve el ``contenido de un objeto apuntado por un puntero o un apuntador''.

Punteros
Declaracin de punteros:
Para una variable entera: int *p; //p es una variable puntero, que apunta a un entero Para una variable char: char *q; //q es una variable puntero que apunta a un char

Punteros
Asignar valor de direccin de memoria a punteros:
Con la direccin de otra variable:
int *r, x; r=&x; //r es una variable puntero, que apunta a un entero

dado por x

Con operador new (en c++): int *puntero1;


apunta a un entero

puntero1= new int;

//puntero1 es una variable puntero, que

Punteros
Asignar valor de direccin de memoria a punteros:
Con funcion malloc(): char *p; P=char *malloc()

//p es una variable puntero, que apunta a un char

//z es una variable puntero a la que se le asignan 100 bytes de memoria

char *z; z=(char *) malloc(100);

Punteros
Ejemplo uso puntero:
main() { int x = 1, y = 2; int *ap; ap = &x;

y = *ap; x = ap;
*ap = 3; }
warning: assignment makes integer from pointer without a cast.

Punteros
Ejemplo uso puntero:
int x = 2, y = 4; int *p; p = &x; y = *p;
direcciones

1000

1004

1008

1000

direcciones 1000

1004 2 y 2

1008 p 1000

direcciones 1000

1004
1000 y 2

1008
p 1000

x = p;
direcciones 1000

Legal pero con advertencia

1004

1008

1000

*p = 5;

Punteros
Aritmtica de puntero:
Suma Resta
main() { float *flp, *flq; *flp = *flp + 10; (*flp)++; flq = flp; }

La direccin es entera, pero un puntero NO es un entero.

La razn por la cual se asocia un puntero a un tipo de dato, es por que se debe conocer en cuantos bytes esta guardado el dato. De tal forma, que cuando se incrementa un puntero, se incrementa el puntero por un ``bloque'' de memoria, en donde el bloque esta en funcin del tamao del dato.
Si a un puntero es a flotante y se le suman 2, el puntero entonces se mueve dos posiciones float que equivalen a 8 bytes.

Asignacin dinmica de memoria y Estructuras dinmicas


La asignacin dinmica de memoria es una caracterstica del lenguaje C. Le permite al usuario crear tipos de datos y estructuras de cualquier tamao de acuerdo a las necesidades que se tengan en el programa. Se revisarn dos de las aplicaciones ms comunes: Arreglos dinmicos Estructuras dinmicas de datos.

Uso de malloc, sizeof y free


La funcin malloc ``toma'' una porcin contigua de memoria.
Esta definida como:

void *malloc(size_t size);


Lo anterior indica que regresar un apuntador del tipo void *, el cual es el inicio en memoria de la porcin reservada de tamao size. Si no puede reservar esa cantidad de memoria la funcin regresa un apuntador nulo o NULL

Dado que void * es regresado, C asume que el apuntador puede ser convertido a cualquier tipo. El tipo de argumento size_t esta definido en la cabecera stddef.h y es un tipo entero sin signo. Por lo tanto:

char *p; p = (char *) malloc(150);


intenta obtener 150 bytes y asignarlos a la direccin de inicio a p. El compilador de C requiere hacer una conversin del tipo. La forma de lograr la coercin (cast) es usando (char *) y (int *), que permite convertir un apuntador void a un apuntador tipo char e int respectivamente.

La funcin sizeof() puede ser usada para encontrar el tamao de cualquier tipo de dato, variable o estructura.
Usamos la funcin sizeof() para indicar el nmero de bytes , por ejemplo:

int *ip; ip = (int *) malloc(100 * sizeof(int) );

Por lo tanto: int i; struct coordenadas {float x,y,z}; struct coordenadas *pt;
sizeof(int), sizeof(i), sizeof(struct coordenadas) y sizeof(PT) son tambin sentencias correctas.

Relacin que existe entre apuntadores y arreglos.


En el siguiente ejemplo se reserva memoria para la variable ip, para manejar la memoria reservada como un arreglo.
main() { int *ip, i;
ip = (int *) malloc(100 * sizeof(int) ); ip[0] = 1000; for (i=0; i<100; ++i) scanf("%d",ip++); }

La funcin free()
La funcin free() toma un apuntador como un argumento y libera la memoria a la cual el apuntador hace referencia

free(pt);

/* libera la memoria asignada al apuntador pt usando free() */

calloc y realloc
Prototipos:

void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size);

Cuando se usa la funcin malloc() la memoria no es inicializada (a cero) o borrada. Si se quiere inicializar la memoria entonces se puede usar la funcin calloc

Por lo tanto para asignar a 100 elementos enteros que estn inicializados a cero se puede hacer:

int *ip; ip = (int *) calloc(100, sizeof(int) );

La funcin realloc intenta cambiar el tamao de un bloque de memoria previamente asignado Si el bloque se hace ms grande, entonces el contenido anterior permanece sin cambios y la memoria es agregada al final del bloque.

Si el tamao se hace ms pequeo entonces el contenido sobrante permanece sin cambios. Si el tamao del bloque original no puede ser redimensionado, entonces realloc intentar asignar un nuevo bloque de memoria y copiar el contenido anterior. Por lo tanto, la funcin devolver un nuevo apuntador (o de valor diferente al anterior), este nuevo valor ser el que deber usarse.

Si no puede ser reasignada nueva memoria la funcin realloc devuelve NULL.

Si para el ejemplo anterior, se quiere reasignar la memoria a 50 enteros en vez de 100 apuntados por ip, se har;

ip = (int *) realloc ( ip, 50*sizeof(int) );

Listas ligadas o enlazadas


Dada la estructura:
typedef struct { int valor; struct ELEMENTO *sig; } ELEMENTO;

La cual puede crecer en forma dinmica.


ELEMENTO *liga; liga = (ELEMENTO *) malloc( sizeof(ELEMENT) ); /* Asigna memoria para liga */ free(liga); // libera la memoria asignada al apuntador liga

Das könnte Ihnen auch gefallen