Sunteți pe pagina 1din 4

CONSULTA

.Asignacin Dinmica De Memoria Y Estructuras Dinmicas La asignacin dinmica de memoria es una caracterstica de 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 es empleada comnmente para intentar ``tomar'' 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 *cp; cp = (char *) malloc(100);

intenta obtener 100 bytes y asignarlos a la direccin de inicio a cp. Es usual usar la funcin sizeof() para indicar el nmero de bytes, por ejemplo: int *ip; ip = (int *) malloc(100 * sizeof(int) );

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 voida un apuntador tipo char e int respectivamente. Hacer la conversin al tipo de apuntador correcto asegura que la aritmtica con el apuntador funcionar de forma correcta. Es una buena prctica usar sizeof() an si se conoce el tamao actual del dato que se requiere, -- ya que de esta forma el cdigo se hace independiente del dispositivo (portabilidad). La funcin sizeof() puede ser usada para encontrar el tamao de cualquier tipo de dato, variable o estructura. Simplemente se debe proporcionar uno de los anteriores como argumento a la funcin.

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

En el siguiente ejemplo se reserva memoria para la variable ip, en donde se emplea la relacin que existe entre apuntadores y arreglos, para manejar la memoria reservada como un arreglo. Por ejemplo, se pueden hacer cosas como: main() { int *ip, i; ip = (int *) malloc(100 * sizeof(int) ); ip[0] = 1000; for (i=0; i<100; ++i) scanf("%d",ip++); }

Cuando se ha terminado de usar una porcin de memoria siempre se deber liberar usando la funcin free(). Esta funcin permite que la memoria liberada este disponible nuevemente quizs para otra llamada de la funcin malloc() La funcin free() toma un apuntador como un argumento y libera la memoria a la cual el apuntador hace referencia.

Funcin malloc
Sintaxis: void *malloc(size_t tamanyo); Adjudica espacio para un objeto, cuyo tamao es especificado por tamanyo y cuyo valor es indeterminado.

Valor de retorno:

La funcin malloc retorna un puntero nulo o un puntero al espacio adjudicado.

Ejemplo:

#include <stdio.h> #include <stdlib.h>

int main( void ) { int *numPtr, i; size_t tamanyo=0;

printf( "Introduzca el tamao de la lista: " ); scanf( "%d", &tamanyo );

puts( "Adjudicamos espacio a la lista." ); numPtr = (int *)malloc( tamanyo*sizeof(int) );

for( i=0; i<tamanyo-1; i++ ) printf( "%d, ", numPtr[i] = rand() % 100 + 1 ); printf( "%d\n", numPtr[i] = rand() % 100 + 1 );

numPtr = (int *)realloc( numPtr, tamanyo/=2 ); printf( "Recortamos la lista a la mitad: %d\n", tamanyo ); for( i=0; i<tamanyo-1; i++ ) printf( "%d, ", numPtr[i] ); printf( "%d\n", numPtr[i] );

puts( "Liberamos el espacio." ); free( numPtr );

return 0; }

Operador sizeof
Sinopsis
El operador sizeof informa del tamao de almacenamiento utilizado por cualquier objeto, sea un tipo bsico o derivado.

Sintaxis
El operador unitario

sizeof tiene dos formas posibles de sintaxis:

sizeof expresin-unitaria sizeof (nombre-de-tipo) Observe que a pesar del aspecto de la segunda forma de sintaxis, se trata de un operador, no de una funcin. sizeof representa una forma cmoda de obtener informacin sobre el tamao de los tipos bsicos.

Resultado
Cualquiera que sea la forma de sintaxis empleada, el resultado es una constante entera de tipo size_t , con el espacio de memoria (bytes) usada por el operando. Con algunas excepciones, este tamao es determinado por el tipo de operando, y para cada tipo, depende de la implementacin. Es decir, no est predeterminado por el Estndar sino por el compilador utilizado (ver en 2.2.4c unas notas adicionales sobre los tipos bsicos en C++).

4 Ejemplo
#include <iostream.h> int main(void) { // =============== long double ld; class C { public: float x; float y; } c; cout << "Tamao de ld: " << sizeof ld << endl; cout << "Tamao de C: " << sizeof c << endl; cout << "Long double = " << sizeof(long double) << " Bytes" << endl; return 0; } Salida: Tamao de ld: 10 Tamao de C: 8 Long double = 10 Bytes

S-ar putea să vă placă și