English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico de lenguaje C

Control de flujo de lenguaje C

Funciones de C

Arreglos de C

Punteros de C

Cadenas de caracteres de C

Estructuras de lenguaje C

Archivos de lenguaje C

C otros

Manual de referencia de lenguaje C

Asignación dinámica de memoria en C

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>.

C malloc()

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.

Sintaxis de malloc()

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.

C calloc()

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.

Sintaxis de calloc()

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.

free() en C

La memoria dinámica asignada con calloc() o malloc() no se libera automáticamente. Se debe liberar explícitamente el espacio utilizando free().

Sintaxis de free()

free(ptr);

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

Ejemplo1:malloc() y free()

//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.

Ejemplo2:calloc() y free()

//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;
}

realloc() en C

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.

Sintaxis de realloc()

ptr = realloc(ptr, x);

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

Ejemplo3:realloc()

#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