Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Sử dụng realloc() trong C

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ả realloc vào biến tạm (tmp), kiểm tra NULL rồi mới gán cho p. Nếu gán trực tiếp p = realloc(p, ...) và thất bại, p thành NULL -> rò rỉ bộ nhớ cũ.
  • realloc(ptr, 0) tương đương free(ptr) (implementation-defined).
  • Nội dung phần mở rộng không được khởi tạo (rác).