Hàm realloc() thay đổi kích thước khối bộ nhớ đã cấp phát bởi malloc hoặc calloc. Có thể mở rộng hoặc thu hẹp. Khai báo trong <stdlib.h>.
Cú pháp
void *realloc(void *ptr, size_t new_size);
Tham số: ptr – con trỏ bộ nhớ cũ; new_size – kích thước mới (bytes). Trả về con trỏ mới (có thể khác địa chỉ cũ), hoặc NULL nếu thất bại (bộ nhớ cũ vẫn hợp lệ).
Ví dụ
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4, i, *p, sum = 0;
// Cap phat ban dau 4 int
p = (int*)calloc(n, sizeof(int));
if (!p) { printf("Loi cap phat"); return 1; }
printf("Nhap %d so: ", n);
for (i = 0; i < n; i++) {
scanf("%d", p + i);
sum += *(p + i);
}
printf("Tong: %d\n", sum);
// Mo rong len 6 int
int *tmp = (int*)realloc(p, 6 * sizeof(int));
if (!tmp) { printf("Loi realloc"); free(p); return 1; }
p = tmp;
printf("Nhap them 2 so: ");
for (i = 4; i < 6; i++) {
scanf("%d", p + i);
sum += *(p + i);
}
printf("Tong moi: %d\n", sum);
free(p);
return 0;
}
Kết quả
Nhap 4 so: 3 34 28 8
Tong: 73
Nhap them 2 so: 10 15
Tong moi: 145
Giải thích: Cấp phát 4 int, nhập 4 số, tính tổng. realloc mở rộng thành 6 int, nhập thêm 2 số, cộng dồn tổng.
Quan trọng:
- Luôn gán kết quả
reallocvào biến tạm (tmp), kiểm tra NULL rồi mới gán chop. Nếu gán trực tiếpp = realloc(p, ...)và thất bại,pthành NULL -> rò rỉ bộ nhớ cũ. realloc(ptr, 0)tương đươngfree(ptr)(implementation-defined).- Nội dung phần mở rộng không được khởi tạo (rác).