Cấp phát bộ nhớ động trong C : Malloc vs Calloc
Để cấp phát bộ nhớ động trong C, chúng ta có 2 cách:
void* malloc (size_t size);
void* calloc (size_t num, size_t size);
So sánh
###Sử dụng
- Khi sử dụng
malloc
phải tính toán kích thước vùng nhớ cần cấp phát trước rồi truyền vào chomalloc
- Khi sử dụng
calloc
chỉ cần truyền vào số phần tử và kích thước 1 phần tử, thìcalloc
sẽ tự động tính toán và cấp phát vùng nhớ cần thiết
Ví dụ: Cấp phát mảng 10 phần tử kiểu int:
int *a = (int *) malloc( 10 * sizeof( int ));
int *b = (int *) calloc( 10, sizeof( int ));
Hiệu suất / Perfomance
malloc nhanh hơn so với calloc. Lý do là calloc ngoài việc có nhiệm vụ cấp phát vùng nhớ như malloc, nó còn phải gán giá trị cho tất cả các phần tử của vùng nhớ vừa cấp phát = 0
int *a = (int *) calloc(10, sizeof( int ));
tương đương với
memset(b, 0, 10 * sizeof(int));
Sự an toàn
Sử dụng calloc an toàn hơn malloc vì sau khi khởi tạo vùng nhớ thì calloc sẽ khởi tạo vùng nhớ cấp phát = 0, còn vùng nhớ do malloc cấp phát vẫn chứa giá trị rác nên sẽ dễ gây ra lỗi nếu truy xuất tới vùn nhớ này trước khi gán cho nó một giá trị xác định.