Antes de aprender la asignación de memoria dinámica C, comprendamos:
¿Cómo funciona la gestión de memoria en C?
Cuando declaras una variable usando un tipo de datos básico, el compilador de C asigna automáticamente espacio de memoria para la variable en un grupo de memoria llamado pila .
Por ejemplo, una variable flotante toma normalmente 4 bytes (según la plataforma) cuando se declara. Podemos verificar esta información usando el operador sizeof como se muestra en el siguiente ejemplo
#includeint main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
La salida será:
The size of float is 4 bytes
Además, una matriz con un tamaño específico se asigna en bloques de memoria contiguos, cada bloque tiene el tamaño de un elemento:
#includeint main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
El resultado es:
The size of the float array with 10 element is 40
Como se aprendió hasta ahora, al declarar un tipo de datos básico o una matriz, la memoria se administra automáticamente. Sin embargo, existe un proceso para asignar memoria en C que le permitirá implementar un programa en el que el tamaño de la matriz no está decidido hasta que ejecute su programa (tiempo de ejecución). Este proceso se denomina " Asignación de memoria dinámica ".
En este tutorial, aprenderá:
- ¿Cómo funciona la gestión de memoria en C?
- Asignación de memoria dinámica en C
- Función C malloc ()
- La función free ()
- Función C calloc ()
- calloc () vs.malloc (): diferencias clave
- Función C realloc ()
- Matrices dinámicas
Asignación de memoria dinámica en C
La asignación dinámica de memoria es la asignación manual y la liberación de memoria de acuerdo con sus necesidades de programación. La memoria dinámica se administra y sirve con punteros que apuntan al espacio de memoria recién asignado en un área que llamamos el montón.
Ahora puede crear y destruir una matriz de elementos dinámicamente en tiempo de ejecución sin ningún problema. En resumen, la administración automática de memoria usa la pila y la asignación de memoria dinámica C usa el montón.
La biblioteca
Función | Objetivo |
malloc () | Asigna la memoria del tamaño solicitado y devuelve el puntero al primer byte del espacio asignado. |
calloc () | Asigna el espacio para los elementos de una matriz. Inicializa los elementos a cero y devuelve un puntero a la memoria. |
realloc () | Se utiliza para modificar el tamaño del espacio de memoria asignado previamente. |
Libre() | Libera o vacía el espacio de memoria previamente asignado. |
Analicemos las funciones anteriores con su aplicación.
Función C malloc ()
La función C malloc () significa asignación de memoria. Es una función que se utiliza para asignar un bloque de memoria de forma dinámica. Reserva espacio de memoria del tamaño especificado y devuelve el puntero nulo que apunta a la ubicación de la memoria. El puntero devuelto suele ser de tipo void. Significa que podemos asignar la función C malloc () a cualquier puntero.
Sintaxis de la función malloc ():
ptr = (cast_type *) malloc (byte_size);
Aquí,
- ptr es un puntero de cast_type.
- La función C malloc () devuelve un puntero a la memoria asignada de byte_size.
Ejemplo de malloc ():
Example: ptr = (int *) malloc (50)
Cuando esta declaración se ejecuta con éxito, se reserva un espacio de memoria de 50 bytes. La dirección del primer byte del espacio reservado se asigna al puntero ptr de tipo int.
Considere otro ejemplo:
#includeint main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */if (ptr != NULL) {*(ptr + 5) = 480; /* assign 480 to sixth integer */printf("Value of the 6th integer is %d",*(ptr + 5));}}
Producción:
Value of the 6th integer is 480
- Observe que se usó sizeof (* ptr) en lugar de sizeof (int) para hacer que el código sea más robusto cuando la declaración * ptr se transmita a un tipo de datos diferente más adelante.
- La asignación puede fallar si la memoria no es suficiente. En este caso, devuelve un puntero NULL. Por lo tanto, debe incluir código para verificar si hay un puntero NULL.
- Tenga en cuenta que la memoria asignada es contigua y puede tratarse como una matriz. Podemos usar aritmética de punteros para acceder a los elementos de la matriz en lugar de usar corchetes []. Aconsejamos usar + para referirse a elementos de matriz porque el uso de incrementación ++ o + = cambia la dirección almacenada por el puntero.
La función Malloc () también se puede utilizar con el tipo de datos de caracteres, así como con tipos de datos complejos, como estructuras.
La función free ()
La memoria para las variables se desasigna automáticamente en el momento de la compilación. En la asignación de memoria dinámica, debe desasignar la memoria de forma explícita. Si no lo hace, puede encontrar un error de memoria insuficiente.
Se llama a la función free () para liberar / desasignar memoria en C. Al liberar memoria en su programa, hace más disponible para su uso posterior.
Por ejemplo:
#includeint main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){*(ptr + 2) = 50;printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}
Producción
Value of the 2nd integer is 50
Función C calloc ()
La función C calloc () significa asignación contigua. Esta función se utiliza para asignar varios bloques de memoria. Es una función de asignación de memoria dinámica que se utiliza para asignar la memoria a estructuras de datos complejas, como matrices y estructuras.
La función Malloc () se usa para asignar un solo bloque de espacio de memoria, mientras que calloc () en C se usa para asignar múltiples bloques de espacio de memoria. Cada bloque asignado por la función calloc () es del mismo tamaño.
Sintaxis de la función calloc ():
ptr = (cast_type *) calloc (n, size);
- La declaración anterior se utiliza para asignar n bloques de memoria del mismo tamaño.
- Una vez que se asigna el espacio de memoria, todos los bytes se inicializan a cero.
- Se devuelve el puntero que se encuentra actualmente en el primer byte del espacio de memoria asignado.
Siempre que hay un error al asignar espacio de memoria, como la falta de memoria, se devuelve un puntero nulo.
Ejemplo de calloc ():
El programa siguiente calcula la suma de una secuencia aritmética.
#includeint main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \ n ");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}
Resultado:
Building and calculating the sequence sum of the first 10 termsSum = 45
calloc () vs.malloc (): diferencias clave
A continuación se muestra la diferencia clave entre malloc () Vs calloc () en C:
La función calloc () es generalmente más adecuada y eficiente que la función malloc (). Si bien ambas funciones se utilizan para asignar espacio de memoria, calloc () puede asignar varios bloques a la vez. No es necesario que solicite un bloque de memoria cada vez. La función calloc () se utiliza en estructuras de datos complejas que requieren mayor espacio de memoria.
El bloque de memoria asignado por un calloc () en C siempre se inicializa a cero mientras que en la función malloc () en C, siempre contiene un valor basura.
Función C realloc ()
Usando la función C realloc () , puede agregar más tamaño de memoria a la memoria ya asignada. Expande el bloque actual dejando el contenido original como está. realloc () en C significa reasignación de memoria.
realloc () también se puede utilizar para reducir el tamaño de la memoria asignada previamente.
Sintaxis de la función realloc ():
ptr = realloc (ptr,newsize);
La declaración anterior asigna un nuevo espacio de memoria con un tamaño específico en la variable newsize. Después de ejecutar la función, el puntero volverá al primer byte del bloque de memoria. El nuevo tamaño puede ser mayor o menor que la memoria anterior. No podemos estar seguros de que si el bloque recién asignado apuntará a la misma ubicación que la del bloque de memoria anterior. Esta función copiará todos los datos anteriores en la nueva región. Se asegura de que los datos permanezcan seguros.
Ejemplo de realloc ():
#includeint main () {char *ptr;ptr = (char *) malloc(10);strcpy(ptr, "Programming");printf(" %s, Address = %u\n", ptr, ptr);ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;}
Siempre que realloc () en C da como resultado una operación fallida, devuelve un puntero nulo y los datos anteriores también se liberan.
Matrices dinámicas en C
Una matriz dinámica en C permite que la cantidad de elementos crezca según sea necesario. C Los arreglos dinámicos se utilizan ampliamente en algoritmos informáticos.
En el siguiente programa, hemos creado y redimensionado una matriz dinámica en C
#includeint main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (i = 0; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);elements = 4;arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elementsprintf("After realloc\n");for (i = 2; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);free(arr_dynamic);}
Resultado del programa C Dynamic array en la pantalla:
arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3
Resumen
- Podemos administrar dinámicamente la memoria creando bloques de memoria según sea necesario en el montón
- En C Dynamic Memory Allocation, la memoria se asigna en un tiempo de ejecución.
- La asignación de memoria dinámica permite manipular cadenas y matrices cuyo tamaño es flexible y se puede cambiar en cualquier momento en su programa.
- Es necesario cuando no tiene idea de cuánta memoria va a ocupar una estructura en particular.
- Malloc () en C es una función de asignación de memoria dinámica que significa asignación de memoria que bloques de memoria con el tamaño específico inicializado a un valor de basura
- Calloc () en C es una función de asignación de memoria contigua que asigna múltiples bloques de memoria a la vez inicializados a 0
- Realloc () en C se usa para reasignar memoria de acuerdo con el tamaño especificado.
- La función Free () se utiliza para borrar la memoria asignada dinámicamente.