Función de la biblioteca C -realloc()

C 标准库 - <stdlib.h>Biblioteca estándar de C - <stdlib.h>

realloc() es una función de la biblioteca estándar de C que se utiliza para reasignar espacio de memoria. Es muy importante en la gestión dinámica de memoria, especialmente cuando se necesita ajustar el tamaño de la memoria ya asignada.

Función de la biblioteca Cvoid *realloc(void *ptr, size_t size)Intenta reajustar el tamaño del bloque de memoria previamente asignado mediante la llamada amallococallocasignado porptrel tamaño del bloque de memoria al que apunta.

Declaración

La siguiente es la declaración de la función realloc():

void *realloc(void *ptr, size_t size)

Parámetros

  • ptr-- Puntero a un bloque de memoria que se va a reasignar. Dicho bloque de memoria fue asignado previamente mediante la llamada a malloc, calloc o realloc. Si es un puntero nulo, se asignará un nuevo bloque de memoria y la función devolverá un puntero que apunta a él.
  • size-- El nuevo tamaño del bloque de memoria, en bytes. Si el tamaño es 0 y ptr apunta a un bloque de memoria existente, el bloque de memoria al que apunta ptr será liberado y se devolverá un puntero nulo.

Valor de retorno

  • Si tiene éxito,realloc()devuelve un puntero al nuevo bloque de memoria.
  • Si falla, devuelveNULLNULL, y el bloque de memoria original permanece sin cambios (no se libera).

Instrucciones de uso

  • realloc()Puede mover el bloque de memoria a una nueva ubicación (si no hay suficiente espacio en la ubicación original para acomodar el nuevo tamaño). Si el movimiento tiene éxito,ptrel puntero apuntará a la nueva ubicación. Se debe prestar especial atención: el antiguoptrpuntero debe actualizarse a larealloc()nueva dirección devuelta por realloc().
  • Si la asignación de memoria falla,realloc()devuelveNULLNULL, mientras que el bloque de memoria original no se libera. Para evitar fugas de memoria, se debe utilizar un puntero temporal para recibir elrealloc()valor de retorno de realloc(), y comprobar si esNULL。

Ejemplo

El siguiente ejemplo demuestra el uso de la función realloc().

Ejemplo 1

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str; /*Asignación de memoria inicial*/ str = (char *) malloc(15); strcpy(str, "ejemplo"); printf("String = %s, Address = %p\n", str, str); /*Reasignación de memoria*/ str = (char *) realloc(str, 25); strcat(str, ".com"); printf("String = %s, Address = %p\n", str, str); free(str); return(0); }

Compilemos y ejecutemos el programa anterior, esto producirá el siguiente resultado:

String = ejemplo,  Address = 0x7fa2f8c02b10
String = example.com,  Address = 0x7fa2f8c02b10

Ejemplo 2

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = malloc(5 * sizeof(int));  // Asignar memoria para 5 enteros

    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // Rellenar el array
    for (int i = 0; i < 5; i++) {
        arr[i] = i * 2;
    }

    // Reasignar memoria, ajustar al tamaño de 10 enteros
    int *new_arr = realloc(arr, 10 * sizeof(int));

    if (new_arr == NULL) {
        printf("Reallocation failed\n");
        free(arr);  // Liberar la memoria original en caso de fallo
        return 1;
    }

    // Rellenar la nueva parte
    for (int i = 5; i < 10; i++) {
        new_arr[i] = i * 2;
    }

    // Imprimir el nuevo array
    for (int i = 0; i < 10; i++) {
        printf("%d ", new_arr[i]);
    }

    free(new_arr);  // Finalmente liberar la memoria
    return 0;
}

Notas

  • Comprobar el valor de retorno: compruebe siempre elrealloc()valor de retorno de realloc(). Si devuelveNULLNULL, no descarte directamente el puntero original.
  • Fuga de memoria: sirealloc()realloc() devuelveNULLNULL, el bloque de memoria original no se libera. En este caso, debe liberar la memoria original y manejar la situación de error.
  • Puntero no válido: si usa directamente el puntero original para recibir elrealloc()nuevo puntero devuelto por realloc(), puede provocar fugas de memoria, especialmente cuandorealloc()realloc() falla. Por lo tanto, normalmente se usa primero un puntero temporal para recibir el valor de retorno.

Usos comunes

  • Expandir dinámicamente el tamaño de arrays u otras estructuras de datos.
  • Se utiliza para manejar conjuntos de datos de tamaño variable en tiempo de ejecución, como listas, cadenas o cachés generados dinámicamente.

C 标准库 - <stdlib.h>Biblioteca estándar de C - <stdlib.h>

Otras extensiones