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

Trong hướng dẫn này, bạn sẽ học cách phân bổ động bộ nhớ trong chương trình C của mình bằng cách sử dụng các hàm thư viện chuẩn: malloc(), calloc(), free () và realloc().

Như bạn đã biết, mảng là tập hợp của một số giá trị cố định. Khi kích thước của một mảng được khai báo, bạn không thể thay đổi nó.

Đôi khi kích thước của mảng bạn đã khai báo có thể không đủ. Để giải quyết vấn đề này, bạn có thể cấp phát bộ nhớ theo cách thủ công trong thời gian chạy. Đây được gọi là cấp phát bộ nhớ động trong lập trình C.

Để phân bổ động bộ nhớ, chức năng thư viện là malloc()calloc()realloc()và free()được sử dụng. Các chức năng này được định nghĩa trong <stdlib.h>tệp tiêu đề.

C malloc()

Tên “malloc” là viết tắt của cấp phát bộ nhớ.

Các malloc()chức năng dự trữ một khối bộ nhớ của số quy định của byte. Và, nó trả về một con trỏ của voidcó thể được đúc thành con trỏ của dưới mọi hình thức.

Cú pháp của malloc()

ptr = (castType*) malloc(size);

Thí dụ

ptr = (float*) malloc(100 * sizeof(float));

Câu lệnh trên cấp phát 400 byte bộ nhớ. Đó là vì kích thước của floatlà 4 byte. Và, con trỏ ptr giữ địa chỉ của byte đầu tiên trong bộ nhớ được cấp phát.

Biểu thức dẫn đến một NULLcon trỏ nếu không thể cấp phát bộ nhớ.

C calloc()

Tên “calloc” là viết tắt của phân bổ liền kề.

Các malloc()bộ nhớ giao đất chức năng và lá bộ nhớ uninitialized, trong khi calloc()bộ nhớ giao đất chức năng và khởi tạo tất cả các bit bằng không.

Cú pháp của calloc()

ptr = (castType*)calloc(n, size);

Thí dụ:

ptr = (float*) calloc(25, sizeof(float));

Câu lệnh trên phân bổ không gian liền kề trong bộ nhớ cho 25 phần tử của kiểu float.


C miễn phí()

Bộ nhớ được cấp phát động được tạo bằng một trong hai calloc()hoặc malloc()không được tự giải phóng. Bạn phải sử dụng rõ ràng free()để giải phóng không gian.


Cú pháp của free()

free(ptr);

Câu lệnh này giải phóng không gian được cấp phát trong bộ nhớ được trỏ bởi ptr.


Ví dụ 1: malloc() và free()

// Program to calculate the sum of n numbers entered by the user

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

int main() {
  int n, i, *ptr, sum = 0;

  printf("Enter number of elements: ");
  scanf("%d", &n);

  ptr = (int*) malloc(n * sizeof(int));
 
  // if memory cannot be allocated
  if(ptr == NULL) {
    printf("Error! memory not allocated.");
    exit(0);
  }

  printf("Enter elements: ");
  for(i = 0; i < n; ++i) {
    scanf("%d", ptr + i);
    sum += *(ptr + i);
  }

  printf("Sum = %d", sum);
  
  // deallocating the memory
  free(ptr);

  return 0;
}

Đầu ra

Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156

Ở đây, chúng tôi đã cấp phát động bộ nhớ cho n số int.


Ví dụ 2: calloc() và free()

// Program to calculate the sum of n numbers entered by the user

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

int main() {
  int n, i, *ptr, sum = 0;
  printf("Enter number of elements: ");
  scanf("%d", &n);

  ptr = (int*) calloc(n, sizeof(int));
  if(ptr == NULL) {
    printf("Error! memory not allocated.");
    exit(0);
  }

  printf("Enter elements: ");
  for(i = 0; i < n; ++i) {
    scanf("%d", ptr + i);
    sum += *(ptr + i);
  }

  printf("Sum = %d", sum);
  free(ptr);
  return 0;
}

Đầu ra

Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156

C realloc()

Nếu bộ nhớ được cấp phát động không đủ hoặc nhiều hơn yêu cầu, bạn có thể thay đổi kích thước của bộ nhớ được cấp phát trước đó bằng cách sử dụng realloc()hàm.

Cú pháp của realloc()

ptr = realloc(ptr, x);

Ở đây, ptr được phân bổ lại với kích thước mới là x .


Ví dụ 3: realloc()

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

int main() {
  int *ptr, i , n1, n2;
  printf("Enter size: ");
  scanf("%d", &n1);

  ptr = (int*) malloc(n1 * sizeof(int));

  printf("Addresses of previously allocated memory:\n");
  for(i = 0; i < n1; ++i)
    printf("%pc\n",ptr + i);

  printf("\nEnter the new size: ");
  scanf("%d", &n2);

  // rellocating the memory
  ptr = realloc(ptr, n2 * sizeof(int));

  printf("Addresses of newly allocated memory:\n");
  for(i = 0; i < n2; ++i)
    printf("%pc\n", ptr + i);
  
  free(ptr);

  return 0;
}

Đầu ra

Enter size: 2
Addresses of previously allocated memory:
26855472
26855476

Enter the new size: 4
Addresses of newly allocated memory:
26855472
26855476
26855480
26855484








Gõ tìm kiếm nhanh...