Ủng hộ tôi
Trong ngôn ngữ lập trình C, phần không gian bộ nhớ được dùng cho cấp phát động được gọi là heap và việc cấp phát được thao tác thông qua 2 hàm là malloc() và free() đã được cung cấp trong thư viện chuẩn stdlib.h:
Hàm malloc() nhận 1 đối số là kích thước vùng nhớ cần được cấp phát theo byte. Kết quả trả về là một con trỏ chứa địa chỉ bắt đầu của vùng nhớ đã được cấp phát. Nếu việc cấp phát thất bại thì con trỏ sẽ mang giá trị NULL.
Có 2 biến thể của hàm malloc():
Hàm calloc() nhận 2 đối số là (1) số lượng phần tử cần được lưu trữ (numEle) và (2) kích thước của mỗi phần tử (sizeEle) được lưu trữ theo byte. Theo đó, kích thước vùng nhớ cần được cấp phát theo byte là numEle x sizeEle. Kết quả trả về là một con trỏ chứa địa chỉ bắt đầu của vùng nhớ đã được cấp phát. Nếu việc cấp phát thất bại thì con trỏ sẽ mang giá trị NULL. Đặc biệt, hàm calloc() sẽ khởi tạo giá trị 0 cho toàn bộ các phần tử trong vùng nhớ đã được cấp phát.
Khác với malloc() và calloc(), hàm realloc() dùng để điều chỉnh lại kích thước vùng nhớ đã được cấp phát bởi hàm malloc(). Hàm realloc() nhận 2 đối số là (1) con trỏ trả về của hàm malloc() và (2) kích thước vùng nhớ mới theo byte. Nếu kích thước mới nhỏ hơn kích thước ban đầu thì con trỏ trả về vẫn là con trỏ cũ và vùng nhớ nằm ngoài sẽ được giải phóng. Nếu kích thước mới lớn hơn kích thước ban đầu thì cấp phát thì có 2 trường hợp xảy ra:
Mở rộng vùng nhớ cũ nếu vùng nhớ sau nó đủ để cấp phát. Kết quả trả về là con trỏ ban đầu.
Cấp phát một vùng nhớ mới và sao chép toàn bộ vùng nhớ cũ qua vùng nhớ mới, giải phóng vùng nhớ cũ. Kết quả trả về là một con trỏ chứa địa chỉ bắt đầu của vùng nhớ mới đã được cấp phát. Bản chất trong trường hợp này là gọi mới 1 hàm malloc() để cấp phát theo kích thước mới.
Hàm free() nhận 1 đối số là địa chỉ bắt đầu của vùng nhớ cần được thu hồi (chính là con trỏ trả về bởi hàm malloc()). Lưu ý là hàm free() không thông báo kết quả của việc thu hồi vùng nhớ. Để đảm bảo vùng nhớ đã được thu hồi không bị sử dụng cho một mục đích khác gây nguy hại đến chương trình thì nên gán lại giá trị NULL cho con trỏ được trả về bởi hàm malloc() sau khi gọi hàm free().
Vùng nhớ được cấp phát bằng cách sử dụng hàm malloc() không thực sự đúng bằng kích thước truyền vào vì vùng nhớ được cấp phát sẽ phải dành riêng một không gian để lưu trữ kích thước của vùng nhớ đã được cấp phát để sau này hàm free() có thể sử dụng. Đây chính là lý do mà hàm free() không có đối số kích thước của vùng nhớ cần được thu hồi. Vùng nhớ dành riêng này sẽ nằm ngay trước địa chỉ được trả về của hàm malloc(): |<kích thước vùng nhớ>|<vùng nhớ được sử dụng>|