Dynamic allocation (cấp phát động)

So sánh C và C++

  • C: dùng malloc/calloc để cấp phát, free để giải phóng.
  • C++: dùng new để cấp phát, delete hoặc delete[] để giải phóng
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5; // số phần tử cần cấp phát

    // malloc/calloc cấp phát vùng nhớ cho n phần tử kiểu int, sẽ trả về NULL nếu không cấp phát được bộ nhớ
    int *arr = (int*) malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("Không đủ bộ nhớ!\n");
        return 1;
    }

    // khởi tạo giá trị thủ công
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    printf("C (malloc): ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    free(arr); // giải phóng vùng nhớ
    return 0;
}
C (malloc): 1 2 3 4 5
#include <iostream>
using namespace std;

int main() {
    int n = 5; // số phần tử cần cấp phát

    int *arr = nullptr;

    try {
        // new cấp phát vùng nhớ cho n phần tử kiểu int, nếu thất bại sẽ ném std::bad_alloc
        arr = new int[n];
    } catch (bad_alloc &e) {
        cout << "Không đủ bộ nhớ!\n";
        return 1;
    }

    // khởi tạo giá trị
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    cout << "C++ (new): ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    delete[] arr; // giải phóng vùng nhớ
    return 0;
}
C++ (new): 1 2 3 4 5

malloc vs calloc

Trong C, cả malloc và calloc đều dùng để cấp phát bộ nhớ động, nhưng chúng có một vài điểm khác biệt quan trọng

malloc thường nhanh hơn vì không cần gán giá trị ban đầu, nhưng calloc tiện lợi khi muốn vùng nhớ sạch (tránh lỗi do giá trị rác).

calloc = malloc + memset(arr, 0, n * sizeof(int)); // khởi tạo toàn bộ vùng nhớ về 0

HàmCách dùngKhởi tạo bộ nhớTham sốTrả về
mallocptr = (int*) malloc(n * sizeof(int));Không khởi tạo, vùng nhớ chứa giá trị rác1 tham số: tổng số byte cần cấp phátCon trỏ tới vùng nhớ
callocptr = (int*) calloc(n, sizeof(int));Khởi tạo toàn bộ vùng nhớ về 02 tham số: số phần tử và kích thước mỗi phần tửCon trỏ tới vùng nhớ
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5; // số phần tử cần cấp phát

     // malloc cấp phát n * sizeof(int) byte, nhưng KHÔNG khởi tạo giá trị
    int *arr = (int*) malloc(n * sizeof(int));

    printf("malloc: ");
    for(int i=0; i<n; i++) {
        // do chưa khởi tạo, giá trị ở đây là "rác" (ngẫu nhiên trong bộ nhớ)
        printf("%d ", arr[i]);
    }

    free(arr); // giải phóng vùng nhớ đã cấp phát
    return 0;
}
malloc: 32767 -12345 0 42 9999
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5; // số phần tử cần cấp phát

    // calloc cấp phát n phần tử, mỗi phần tử có kích thước sizeof(int)
    int *arr = (int*) calloc(n, sizeof(int));

    printf("calloc: ");
    for(int i=0; i<n; i++) {
        // tất cả giá trị đều là 0 vì calloc đã khởi tạo
        printf("%d ", arr[i]);
    }

    free(arr); // giải phóng vùng nhớ đã cấp phát
    return 0;
}
calloc: 0 0 0 0 0

Leave a Comment