Cấp phát bộ nhớ động

Hàm calloc và malloc

Khi cần một số lượng ô nhớ không biết trước được như lúc nhập dữ liệu từ bàn phím hoặc đọc file, ta cần một cách để quản lý bộ nhớ động. Trong thư viện stdlib (standard library) có hai hàm cấp phát bộ nhớ động đó là callocmalloc.

1
2
3
4
5
#include <stdlib.h>
int main() {
  int* p1 = (int*) calloc(10, sizeof(int)); // cấp phát 10 ô nhớ kiểu int
  int* p2 = (int*) malloc(10 * sizeof(int)); // tương tự như trên
}

Hai hàm callocmalloc gần như không có gì khác nhau ngoại trừ số lượng tham số truyền vào. Khi số lượng ô nhớ không thể cấp phát được do một lý do nào đó thì hàm này sẽ trả về con trỏ NULL. Vì vậy việc kiểm tra giá trị trả về của con trỏ là rất quan trọng.

1
2
3
4
5
6
7
#include <stdlib.h>
int main() {
  int* p1 = (int*) calloc(10, sizeof(int)); // cấp phát 10 ô nhớ kiểu int
  if (p1 != NULL) {
    printf("Success");
  }
}

Hàm free

Dữ liệu của các ô nhớ cấp phát tiếp tục tồn tại đến khi nào chúng ta giải phóng nó qua hàm free. Hàm free chỉ được gọi một lần duy nhất với mỗi ô nhớ được cấp phát. Nếu không sử dụng hàm free khi không cần sử dụng đến ô nhớ đó thì chương trình sẽ chiếm tài nguyên của máy tính một cách không thiết - hay còn được gọi là rò rỉ bộ nhớ (memory leak).

1
2
3
4
5
int* p1 = (int*) calloc(10, sizeof(int)); // cấp phát 10 ô nhớ kiểu int
if (p1 != NULL) {
  printf("Success");
  free(p1); // giải phóng ô nhớ đã cấp phát
}

Bộ nhớ Heap và Stack

Trong chương trình C có hai loại bộ nhớ Heap và Stack. Bộ nhớ stack do chương trình quản lý khi cần có một số lượng bytes định trước. Bộ nhớ Stack là bộ nhớ mà được chúng ta quản lý khi chỉ biết kích thước cần dùng đến lúc chạy chương trình. Bộ nhớ Stack này sẽ được chương trình giải phóng khi không cần thiết.

Bộ nhớ Heap là bộ nhớ khi không biết trước số lượng ô nhớ. Các hàm callocmalloc sẽ tạo các ô nhớ trên Heap. Trong ngôn ngữ C không quản lý việc giải phóng ô nhớ này vào lúc nào nên chúng ta sẽ làm việc đó thủ công qua hàm free.