English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderás a usar las funciones de la biblioteca estándar: malloc(), calloc(), free() y realloc() para asignar memoria dinámicamente en programas en C.
Como ya sabes, el array es una colección de valores fijos. Después de declarar el tamaño del array, no se puede cambiar.
A veces, el tamaño del array declarado puede ser insuficiente. Para resolver este problema, se puede asignar memoria manualmente en tiempo de ejecución. Esto se llama asignación de memoria dinámica en el lenguaje de programación C.
Se puede usar la función de la biblioteca estándar malloc(), calloc(), realloc() y free() para asignar memoria dinámicamente. Estas funciones están definidas en el archivo de encabezado <stdlib.h>.
El nombre “malloc” indica la asignación de memoria.
La función malloc() reserva un bloque de memoria de un número específico de bytes. Y, devuelve un puntero voidPunteropuede convertirse en cualquier tipo de puntero.
ptr = (castType*) malloc(size);
Ejemplo
ptr = (float*) malloc(100 * sizeof(float));
La sentencia superior asignó400 bytes de memoria. Porque el tamaño de los números de coma flotante es4Bytes. Y, el puntero ptr guarda la dirección del primer byte de la memoria asignada.
Si no se puede asignar memoria, la expresión generará un puntero NULL.
El nombre “calloc” indica la asignación continua.
La función malloc() asigna memoria y mantiene la memoria no inicializada. Mientras que la función calloc() asigna memoria e inicializa todos los bits a cero.
ptr = (castType*)calloc(n, size);
Ejemplo:
ptr = (float*)calloc(25, sizeof(float));
La declaración anterior asigna espacio en memoria para25elementos de tipo float en un espacio contiguo.
La memoria dinámica asignada con calloc() o malloc() no se libera automáticamente. Se debe liberar explícitamente el espacio utilizando free().
free(ptr);
La declaración libera el espacio asignado en la memoria apuntada por ptr.
//Un programa para calcular la suma de los n números ingresados por el usuario #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("Ingrese la cantidad de elementos: "); scanf("%d", &n); ptr = (int*)malloc(n * sizeof(int)); // Si no se puede asignar memoria if(ptr == NULL) { printf("¡Error! Memoria no asignada."); exit(0); } printf("Ingrese el elemento: "); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Sum = %d", sum); //Liberación de memoria free(ptr); return 0; }
Aquí, se asigna memoria dinámica para n enteros.
//Un programa para calcular la suma de los n números ingresados por el usuario #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("Ingrese la cantidad de elementos: "); scanf("%d", &n); ptr = (int*)calloc(n, sizeof(int)); if(ptr == NULL) { printf("¡Error! Memoria no asignada."); exit(0); } printf("Ingrese el elemento: "); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
Si la memoria dinámica asignada no es suficiente o excede lo necesario, se puede usar la función realloc() para cambiar el tamaño de la memoria asignada anteriormente.
ptr = realloc(ptr, x);
Aquí, ptr se reasigna al nuevo tamaño x.
#include <stdio.h> #include <stdlib.h> int main() { int *ptr, i, n1, n2; printf("Ingrese el tamaño: "); scanf("%d", &n1); ptr = (int*)malloc(n1 * sizeof(int)); printf("Dirección de memoria asignada anteriormente: "); for (i = 0; i < n1; ++i) printf("睵n", ptr + i); printf("\nIngrese el nuevo tamaño: "); scanf("%d", &n2); //reasignación de memoria ptr = realloc(ptr, n2 * sizeof(int)); printf("Nueva dirección de memoria asignada: "); for (i = 0; i < n2; ++i) printf("睵n", ptr + i); free(ptr); return 0; }
Al ejecutar el programa, la salida es:
Ingrese el tamaño: 3 Dirección de memoria asignada anteriormente: 7452312 7452316 7452320 Ingrese el nuevo tamaño: 5 Dirección de memoria asignada recientemente: 7452312 7452316 7452320 7452324 7452328