Computer >> Máy Tính >  >> Lập trình >> lập trình C

Phân bổ bộ nhớ động trong C là gì?

Ở đây chúng ta sẽ xem cấp phát bộ nhớ động là gì 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ớ. Bạn có thể tìm thấy các hàm này trong tệp tiêu đề . Các chức năng sau để cấp phát bộ nhớ.

Hàm Mô tả
void * calloc (int num, int size); Hàm này phân bổ một mảng num mỗi phần tử có kích thước tính bằng byte sẽ có kích thước.
void free (void * address); Hàm này giải phóng một khối khối bộ nhớ được chỉ định bởi địa chỉ.
void * malloc (int num); Hàm này phân bổ một mảng num byte và để chúng chưa khởi tạo.
void * realloc (void * address, int newsize); Chức năng này phân bổ lại bộ nhớ mở rộng bộ nhớ lên đến newsize .

Phân bổ bộ nhớ động

Trong khi lập trình, nếu bạn biết về kích thước của một mảng thì sẽ rất dễ dàng và bạn có thể xác định nó là một mảng. Ví dụ:để lưu trữ tên của bất kỳ người nào, tên đó có thể chứa tối đa 100 ký tự, vì vậy bạn có thể xác định tên 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ữ, chẳng hạn như bạn muốn lưu trữ một mô tả chi tiết về một chủ đề. Ở đây, chúng ta cần xác định một con trỏ tới ký tự mà không cần xác định dung lượng bộ nhớ là bao nhiêu và sau đó, dựa trên yêu cầu, chúng ta có thể cấp phát bộ nhớ như thể hiện trong ví dụ dưới đây -

Mã mẫu

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
   char name[100];
   char *description;
   strcpy(name, "Adam");
   /* allocate memory dynamically */
   description = malloc( 200 * sizeof(char) );
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   } else {
      strcpy( description, "Adam a DPS student in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
}

Đầu ra

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Chương trình tương tự có thể được viết bằng calloc (); chỉ có điều là bạn cần thay malloc bằng 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ể chuyển 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 mà khi kích thước đã được xác định, bạn không thể thay đổi nó.

Thay đổi kích thước các vị trí bộ nhớ

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ớ được cấp bởi chương trình của bạn nhưng cách tốt nhất là khi bạn không cần bộ nhớ nữa thì bạn nên giải phóng bộ nhớ đó 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 (). Hãy để chúng tôi kiểm tra lại chương trình trên và sử dụng các hàm realloc () và free () -

Mã mẫu

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
   char name[100];
   char *description;
   strcpy(name, "Adam");
   /* allocate memory dynamically */
   description = malloc( 30 * sizeof(char) );
   if( description == NULL ) {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   } else {
      strcpy( description, "Adam 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, "He is in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
   /* release memory using free() function */
   free(description);
}

Đầu ra

Name = Adam
Description: Adam a DPS student.He is in class 10th

Bạn có thể thử ví dụ trên mà không cần cấp phát lại bộ nhớ bổ sung và hàm strcat () sẽ báo lỗi do thiếu bộ nhớ khả dụng trong mô tả.