Với những nội dung bài trước về Đệ quy, đổi biến số, xử lý lỗi,… trong C, hôm nay chúng ta sẽ đi tìm hiểu về một phần quan trọng khác trong các chương trình C đó là: quản lý bộ nhớ trong C. Ngôn ngữ lập trình C cung cấp một số chức năng để cấp phát và quản lý bộ nhớ. Có thể tìm thấy các hàm này trong tệp tiêu đề <stdlib.h>.
Hàm |
Mô tả chức năng |
void * calloc (int num, int size); |
Hàm này phân bổ một mảng các phần tử num, mỗi phần tử có kích thước bằng byte sẽ là kích thước. |
void free (void * address); |
Hàm này giải phóng một khối khối nhớ được chỉ định bởi địa chỉ. |
void * malloc (int num); |
Hàm này phân bổ một mảng các byte num và để chúng không được khởi tạo. |
void * realloc (void * address, int newsize); |
Chức năng này tái phân bổ bộ nhớ mở rộng nó lên đến tin tức. |
Trong khi lập trình, nếu bạn nhận được kích thước của một mảng, thì bạn sẽ rất dễ dàng định nghĩa một mảng.
Ví dụ, để lưu trữ tên của bất kỳ người nào, nó có thể lên tới tối đa 100 ký tự, vì vậy bạn có thể định nghĩa một cái gì đó như sau:
char name[100];
Nhưng bây giờ chúng ta hãy xem xét một tình huống mà bạn không có ý tưởng về độ dài của văn bản bạn cần để lưu trữ, ví dụ, bạn muốn lưu trữ một mô tả chi tiết về một chủ đề. Ở đây chúng ta cần định nghĩa một con trỏ tới ký tự mà không cần định nghĩa bao nhiêu bộ nhớ được yêu cầu và sau đó, dựa trên yêu cầu, chúng ta có thể cấp phát bộ nhớ như trong ví dụ dưới đây:
#include
#include
#include
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* allocate memory dynamically */
description = malloc( 200 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy( description, "Zara ali a DPS student in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
Cùng một chương trình có thể được viết bằng calloc (); điều duy nhất là bạn cần phải thay thế malloc với calloc như sau:
calloc(200, sizeof(char));
Vì vậy, bạn có toàn quyền kiểm soát và bạn có thể vượt qua bất kỳ giá trị kích thước nào trong khi cấp phát bộ nhớ, không giống như các mảng khi kích thước được xác định, bạn không thể thay đổi nó.
Khi chương trình của bạn xuất hiện, hệ điều hành sẽ tự động giải phóng tất cả bộ nhớ do chương trình của bạn phân phối nhưng thực tế lúc này bạn không cần bộ nhớ nữa vì vậy bạn nên giải phóng bộ nhớ để chương trình diễn ra mượt mà hơn, bằng cách gọi hàm free ().
Ngoài ra, bạn có thể tăng hoặc giảm kích thước của khối bộ nhớ được cấp phát bằng cách gọi hàm realloc (). Chúng ta hãy kiểm tra lại chương trình trên và sử dụng các hàm realloc () và free ():
#include
#include
#include
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* allocate memory dynamically */
description = malloc( 30 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy( description, "Zara ali a DPS student.");
}
/* suppose you want to store bigger description */
description = realloc( description, 100 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcat( description, "She is in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
/* release memory using free() function */
free(description);
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau.
Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th
Bạn có thể thử ví dụ trên mà không cần phân bổ lại bộ nhớ thừa, và hàm strcat () sẽ đưa ra một lỗi do thiếu bộ nhớ sẵn có trong mô tả.
Các tài liệu C khác bạn nên học: