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
ptr
làNULL
, hàmrealloc()
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()
và 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