malloc() - Cấp phát bộ nhớ động
Cấp phát size byte trên heap, trả về con trỏ void* trỏ đến byte đầu. Trả về NULL nếu thất bại.
Cú pháp
void* malloc(size_t size);
Sử dụng điển hình
int* ptr = (int*)malloc(n * sizeof(int));
if (!ptr) {
// Xử lý lỗi hết bộ nhớ
return -1;
}
Ví dụ malloc()
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4;
int *p = (int*)malloc(n * sizeof(int));
if (p == NULL) {
printf("Lỗi: Không cấp phát được bộ nhớ\n");
return 1;
}
printf("Nhập %d số: ", n);
int sum = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", p + i);
sum += *(p + i);
}
printf("Tổng: %d\n", sum);
free(p); // Quan trọng: giải phóng!
return 0;
}
Kết quả
Nhập 4 số: 32 23 21 8 Tổng: 84
free() - Giải phóng bộ nhớ
Giải phóng bộ nhớ đã cấp phát bởi malloc, calloc, realloc. Không thay đổi giá trị con trỏ (con trỏ vẫn trỏ địa chỉ cũ - dangling pointer).
Cú pháp
void free(void* ptr);
Ví dụ free()
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4;
int *p = (int*)malloc(n * sizeof(int));
if (!p) { printf("Lỗi malloc\n"); return 1; }
// ... sử dụng p ...
free(p); // Giải phóng
p = NULL; // TỐT: tránh dangling pointer
// free(NULL) an toàn - không làm gì
free(p); // OK
return 0;
}
Lỗi thường gặp
| Lỗi | Hậu quả | Khắc phục |
|---|---|---|
| Quên free() | Memory leak | Luôn free, dùng RAII/smart pointer |
| Double free | Heap corruption, crash | Set NULL sau free |
| Free con trỏ không phải malloc | UB, crash | Chỉ free con trỏ từ malloc/calloc/realloc |
| Sử dụng sau free | UB, data corruption | Set NULL, static analysis |
| Không check NULL | Crash khi dereference | Luôn check trước khi dùng |