×

Thay đổi kích thước vùng nhớ đã cấp phát với realloc() trong C

Ngôn ngữ lập trình C là một trong những ngôn ngữ phổ biến nhất trong lập trình hệ thống và phần mềm nhúng nhờ vào sự linh hoạt và hiệu quả mà nó mang lại. Một trong những vấn đề quan trọng trong C là quản lý bộ nhớ động, và hàm realloc() là một công cụ hữu ích giúp bạn có thể thay đổi kích thước của vùng nhớ đã cấp phát mà không làm mất dữ liệu.

Cách hoạt động của realloc()

Hàm realloc() thay đổi kích thước của bộ nhớ đã cấp phát trước đó bởi các hàm như malloc() hoặc calloc(). Nó có cú pháp như sau:

void *realloc(void *ptr, size_t size);
  • ptr: con trỏ đến vùng nhớ đã được cấp phát trước đó. Nếu ptrNULL, hàm realloc() hoạt động giống như malloc().
  • size: kích thước mới của vùng nhớ, tính bằng byte.

Nếu hàm thành công, nó sẽ trả về con trỏ tới vùng nhớ mới với kích thước đã được thay đổi. Nếu thất bại, nó trả về NULL và vùng nhớ cũ vẫn giữ nguyên.

Sử dụng realloc() đúng cách

Cấp phát bộ nhớ động lần đầu và thay đổi kích thước

Đầu tiên, bạn cần sử dụng malloc() hoặc calloc() để cấp phát bộ nhớ động. Sau đó, khi bạn cần thay đổi kích thước của vùng nhớ này, bạn sử dụng realloc().

Ví dụ về việc sử dụng malloc()realloc():

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

int main() {
    int *arr;
    int new_size;

    // Cấp phát bộ nhớ cho 5 số nguyên
    arr = (int *) malloc(5 * sizeof(int));
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // Thay đổi kích thước vùng nhớ để chứa 10 số nguyên
    new_size = 10 * sizeof(int);
    arr = (int *) realloc(arr, new_size);
    if (arr == NULL) {
        printf("Memory reallocation failed\n");
        return 1;
    }

    // Sử dụng vùng nhớ mới cấp phát
    for (int i = 0; i < 10; i++) {
        arr[i] = i + 1;
        printf("%d ", arr[i]);
    }

    // Giải phóng bộ nhớ khi không còn cần thiết
    free(arr);

    return 0;
}

Trong ví dụ trên, chúng ta đã cấp phát bộ nhớ cho một mảng chứa 5 số nguyên bằng cách sử dụng malloc(). Sau đó, chúng ta sử dụng realloc() để thay đổi kích thước của mảng để chứa 10 số nguyên. Nếu việc thay đổi kích thước thành công, chúng ta có thể sử dụng mảng với kích thước mới.

Xử lý khi realloc() thất bại

Khi sử dụng realloc(), sẽ có trường hợp nó trả về NULL do không thể cấp phát đủ bộ nhớ. Điều này có thể dẫn đến việc mất dữ liệu nếu không được xử lý đúng cách.

Ví dụ về xử lý khi realloc() thất bại:

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

int main() {
    int *arr;
    int *temp;
    int new_size;

    // Cấp phát bộ nhớ cho 5 số nguyên
    arr = (int *) malloc(5 * sizeof(int));
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // Thay đổi kích thước vùng nhớ để chứa 10 số nguyên
    temp = (int *) realloc(arr, 10 * sizeof(int));
    if (temp == NULL) {
        // Giải phóng bộ nhớ cũ
        free(arr);
        printf("Memory reallocation failed\n");
        return 1;
    }

    // Gán con trỏ tạm vào con trỏ chính khi thành công
    arr = temp;

    // Sử dụng vùng nhớ mới cấp phát
    for (int i = 0; i < 10; i++) {
        arr[i] = i + 1;
        printf("%d ", arr[i]);
    }

    // Giải phóng bộ nhớ khi không còn cần thiết
    free(arr);

    return 0;
}

Trong ví dụ này, chúng ta sử dụng một con trỏ tạm thời temp để đảm bảo rằng nếu việc cấp phát lại bộ nhớ thất bại, chúng ta vẫn có thể giải phóng bộ nhớ cũ và tránh mất dữ liệu.

Tổng kết

Hàm realloc() trong ngôn ngữ lập trình C là một công cụ mạnh mẽ cho phép bạn thay đổi kích thước của bộ nhớ động đã cấp phát mà không mất dữ liệu. Nó đóng vai trò quan trọng trong việc quản lý bộ nhớ hiệu quả và tránh lãng phí tài nguyên. Tuy nhiên, cần cẩn thận xử lý các trường hợp realloc() thất bại để đảm bảo sự ổn định và tin cậy của chương trình.

Comments