Asignación de memoria dinámica de C usando malloc (), calloc (), free () y realloc ()

En este tutorial, aprenderá a asignar memoria dinámicamente en su programa C usando funciones de biblioteca estándar: malloc (), calloc (), free () y realloc ().

Como sabe, una matriz es una colección de un número fijo de valores. Una vez que se declara el tamaño de una matriz, no puede cambiarlo.

A veces, el tamaño de la matriz que declaró puede ser insuficiente. Para resolver este problema, puede asignar memoria manualmente durante el tiempo de ejecución. Esto se conoce como asignación de memoria dinámica en la programación C.

Para asignar dinámicamente memoria, funciones de la biblioteca son malloc(), calloc(), realloc()y free()se utilizan. Estas funciones se definen en el archivo de encabezado.

C malloc ()

El nombre "malloc" significa asignación de memoria.

La malloc()función reserva un bloque de memoria del número especificado de bytes. Y devuelve un puntero del voidcual se puede convertir en punteros de cualquier forma.

Sintaxis de malloc ()

 ptr = (castType*) malloc(size);

Ejemplo

 ptr = (float*) malloc(100 * sizeof(float));

La declaración anterior asigna 400 bytes de memoria. Es porque el tamaño de floates de 4 bytes. Y el puntero ptr contiene la dirección del primer byte en la memoria asignada.

La expresión da como resultado un NULLpuntero si no se puede asignar la memoria.

C calloc ()

El nombre "calloc" significa asignación contigua.

La malloc()función asigna memoria y deja la memoria sin inicializar. Considerando que, la calloc()función asigna memoria e inicializa todos los bits a cero.

Sintaxis de calloc ()

 ptr = (castType*)calloc(n, size);

Ejemplo:

 ptr = (float*) calloc(25, sizeof(float));

La declaración anterior asigna espacio contiguo en la memoria para 25 elementos de tipo float.

C libre ()

La memoria asignada dinámicamente creada con calloc()o malloc()no se libera por sí sola. Debe utilizar explícitamente free()para liberar el espacio.

Sintaxis de free ()

 free(ptr);

Esta declaración libera el espacio asignado en la memoria apuntada por ptr.

Ejemplo 1: malloc () y free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; ) 

Aquí, hemos asignado dinámicamente la memoria para n número de int.

Ejemplo 2: calloc () y free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; ) 

C realloc ()

Si la memoria asignada dinámicamente es insuficiente o más de la necesaria, puede cambiar el tamaño de la memoria asignada previamente utilizando la realloc()función.

Sintaxis de realloc ()

 ptr = realloc(ptr, x);

Aquí, ptr se reasigna con un nuevo tamaño x.

Ejemplo 3: realloc ()

 #include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )

Cuando ejecute el programa, la salida será:

 Ingrese el tamaño: 2 Direcciones de la memoria previamente asignada: 26855472 26855476 Ingrese el nuevo tamaño: 4 Direcciones de la memoria recién asignada: 26855472 26855476 26855480 26855484

Articulos interesantes...