Cấp phát bộ nhớ dộng trong C – Nh° bạn đã biết, mảng là một tập hợp của các phần tử nằm liên tiếp – StuDocu

Nh° bạn đã biết, mảng là một tập hợp của các phần tử nằm liên tiếp nhau trên bộ nhớ và
có cùng kiểu dữ liệu. Khi khai báo mảng, bạn phải chỉ định rõ kích th°ớc tối đa (số l°ợng
phần tử tối đa). Và sau khi khai báo, bạn không thể thay đổi kích th°ớc của mảng – Cấp
phát tĩnh
.

Đôi khi kích th°ớc của mảng bạn khai báo có thể không đủ sài. Để giải quyết vấn đề này,
bạn có thể cấp phát thêm bộ nhớ theo cách thủ công trong thời gian chạy ch°¡ng trình.
Đó cũng chính là khái niệm cấp phát động trong C.

Bảng d°ới đây so sánh giúp bạn sự khác biệt giữa cấp phát bộ nhớ động và tĩnh.

̄u điểm chính của việc sử dụng cấp phát động là giúp ta tiết kiệm được không gian bộ
nhớ
mà ch°¡ng trình sử dụng. Bởi vì chúng ta sẽ chỉ cấp phát khi cần dùng và có thể giải
phóng vùng nhớ đó ngay sau khi sử dụng xong.

Nh°ợc điểm chính của cấp phát động là bạn phải tự quản lý vùng nhớ mà bạn cấp phát.
Nếu bạn cứ cấp phát mà quên giải phóng bộ nhớ thì ch°¡ng trình của bạn sẽ tiêu thụ hết
tài nguyên của máy tính dẫn đến tình trạng tràn bộ nhớ (memory leak).

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

Để cấp phát vùng nhớ động cho biến con trỏ trong ngôn ngữ C, bạn có thể sử dụng
hàm malloc() hoặc hàm calloc(). Sử dụng hàm free() để giải phóng bộ nhớ đã cấp phát
khi không cần sử dụng, sử dụng realloc() để thay đổi (phân bổ lại) kích th°ớc bộ nhớ đã
cấp phát trong khi chạy ch°¡ng trình.

Sử dụng hàm malloc()

Từ malloc là đại diện cho cụm từ memory allocation (dịch: cấp phát bộ nhớ).

Hàm malloc() thực hiện cấp phát bộ nhớ bằng cách chỉ định số byte cần cấp phát. Hàm
này trả về con trỏ kiểu void cho phép chúng ta có thể ép kiểu về bất cứ kiểu dữ liệu nào.

Cú pháp của hàm malloc():

Ví dụ trên thực hiện cấp phát cho việc l°u trữ 100 số nguyên. Giả sử sizeof int là 4, khi
đó lệnh d°ới đây thực hiện cấp phát 400 bytes. Khi đó, con trỏ ptr sẽ có giá trị là địa chỉ
của byte dữ liệu đầu tiên trong khối bộ nhớ vừa cấp phát.

Trong tr°ờng hợp không thể cấp phát bộ nhớ, nó sẽ trả về một con trỏ NULL.

Sử dụng hàm calloc()

Từ calloc đại diện cho cụm từ contiguous allocation (dịch: cấp phát liên tục).

Hàm malloc() khi cấp phát bộ nhớ thì vùng nhớ cấp phát đó không đ°ợc khởi tạo giá trị
ban đầu. Trong khi đó, hàm calloc() thực hiện cấp phát bộ nhớ và khởi tạo tất cả các ô
nhớ có giá trị bằng 0.

Hàm calloc() nhận vào 2 tham số là số ô nhớ muốn khởi tạo và kích thước của 1 ô nhớ.

Cú pháp của hàm calloc():

Ví dụ sử dụng malloc() và free()

Trong ví dụ d°ới đây, chúng ta sẽ sử dụng hàm malloc() để cấp phát động n * sizeof

int byte và sử dụng xong sẽ dùng free() để giải phóng.

Ví dụ sử dụng calloc() và free()

Trong ví dụ này, chúng ta sẽ dùng calloc() để cấp phát n ô nhớ liên tiếp và mỗi ô nhớ có
kích th°ớc là sizeof int. L°u ý là hàm calloc() sẽ chậm h¡n malloc() một chút do nó phải
thêm b°ớc khởi tạo các ô nhớ có giá trị bằng 0. Do đó, tùy thuộc bạn cần hiệu năng hay
cần khởi tạo giá trị ban đầu mà sử dụng hàm cấp phát thích hợp.

Sử dụng hàm realloc()

Nếu việc cấp phát bộ nhớ động không đủ hoặc cần nhiều h¡n mức đã cấp phát, 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
hàm realloc().

Kết quả chạy: