12.3: Asignación de memoria
- Page ID
- 82155
Para usar las rutinas de memoria, incluye el encabezado stdlib.h
en tu código y asegúrate de vincularte con la biblioteca estándar. Hay dos funciones principales de asignación de memoria. Son malloc ()
y calloc ()
. Aquí están sus prototipos:
void * malloc( unsigned int size ); void * calloc( unsigned int num_item, unsigned int item_size );
malloc ()
toma un solo argumento: El número de bytes que desea asignar del pool libre. calloc ()
toma dos argumentos: El número de elementos que desea encajar en el bloque de memoria y su tamaño en bytes. Básicamente, calloc ()
solo llama a malloc ()
después de multiplicar los dos argumentos juntos. Se utiliza para mayor comodidad. Ambas funciones devuelven un puntero a un tipo void
. ¿Qué es esto? Un puntero vacío
se puede considerar como un puntero genérico, de talla única para todos. Evita posibles choques de tamaño tipo. Puede asignar un puntero vacío
a otro tipo de puntero y no obtener una discrepancia de tipo. Si no se puede hacer la solicitud de memoria (no hay suficiente memoria) entonces las funciones devolverán NULL
. ¡Siempre verifique la devolución NULL! ¡Nunca asumas que la asignación va a funcionar!
Si quieres obtener espacio para 100 bytes, harías algo como esto:
char *cp; cp = malloc( 100 ); if( cp ) { /* memory allocated, do stuff... */ } else { /* not allocated, warn user and fail gracefully... */ }
Si necesitas espacio para 200 dobles, harías algo como esto:
double *dp; if( dp = calloc( 200, sizeof(double) ) ) /* assign and if test in 1 */ { /* memory allocated, do stuff... */ } else { /* not allocated, warn user and fail gracefully... */ }
Tenga en cuenta el uso del operador sizeof ()
anterior. Si tuvieras una estructura y necesitabas crear una (por ejemplo, para agregarla a una lista enlazada), podrías hacer esto:
struct foo *fp; if( fp = calloc( 1, sizeof(struct foo) ) ) { /* remainder as above ... */