Trong ngôn ngữ lập trình C
Bạn sẽ có 3 cách cấp phát động bộ nhớ như sau,
Cách 1: dùng hàm
malloc
Cú pháp của hàm malloc
:
void *malloc(size_t size);
Trong đó:
size
là số lượng phần tử của mảng và có kiểu làsize_t
(không có gì đặc biệt chỗ này cả,size_t
có thể xem như kiểu số nguyên không dấuunsigned int
đa số trong các trường hợp, bạn có thể đọc thêm Kiểu dữ liệu size_t trong C++ là gì? để hiểu rõ hơn).
Khi nào sử dụng hàm malloc
:
Sử dụng hàm malloc
khi bạn muốn cấp phát bộ nhớ với kiểu dữ liệu xác định và giá trị của các phần tử trong mảng sau khi cấp phát được mặc định là giá trị rác
Ví dụ về cách sử dụng hàm malloc
:
Cấp phát bộ nhớ cho một mảng A chứa 10 phần tử với mỗi phần tử có kiểu dữ liệu số nguyên,
int n = 3; //n là số lượng phần tử của mảng A
int *A = (int *)malloc(n); // (2)
// Mảng A sau khi cấp phát sẽ có giá trị rác ví dụ: [-36844083, 16645629, 1404447253]
Ý nghĩa của câu lệnh thứ (2) như sau, hàm malloc
nhận vào tham số n
là số lượng phần tử cần được cấp phát bộ nhớ, theo cú pháp, bản thân hàm malloc
là một con trỏ void
cho nên chúng ta cần phải ép kiểu sang con trỏ kiểu số nguyên bằng cách thêm vào (int *)
với mục đích trả về con trỏ số nguyên để lưu vào con trỏ số nguyên A
là điều mà chúng ta mong muốn.
Cách 2: dùng hàm
calloc
Cú pháp của hàm calloc
:
void *calloc (size_t num, size_t type);
Trong đó:
num
là số lượng phần tử của mảng.type
là kiểu dữ liệu của giá trị mà mảng của bạn sẽ chứa.
Khi nào sử dụng hàm calloc
:
Sử dụng hàm calloc
khi bạn muốn cấp phát bộ nhớ với kiểu dữ liệu xác định và giá trị các phần tử trong mảng sau khi cấp phát được mặc định là 0.
Ví dụ về cách sử dụng hàm calloc
:
int n = 3;
int *A = (int *)calloc(n, sizeof(int)); //(2)
// A sau khi cấp phát có giá trị mặc định là: [0, 0, 0]
Cách câu lệnh thứ (2) hoạt động cũng tương tự như ở hàm malloc
.
Cách 3: dùng hàm
realloc
Cú pháp của hàm realloc
:
void *realloc(void *ptr, size_t size)
Trong đó:
*ptr
là con trỏ tới mảng bạn muốn.size
là số lượng phần tử mới của mảng.
Khi nào sử dụng hàm realloc
:
Sử dụng hàm realloc
khi bạn muốn thay đổi kích thước bộ nhớ đã được cấp phát trước đó bởi hàm malloc
hoặc calloc
.
Ví dụ về sử dụng hàm realloc
:
int n = 3;
int *A = (int *)malloc(n); //Cấp phát bộ nhớ cho mảng A bởi hàm malloc
A = (int *)realloc(A, 5); // (3)
Câu lệnh thứ (3) đã thay đổi kích thước của mảng A từ có thể chứa 3 phần tử số nguyên lên có thể chứa 5 phần tử số nguyên.
Để giải phóng bộ nhớ được cấp phát bởi các hàm
malloc()
,calloc()
vàrealloc()
sử dụng câu lệnhfree()
Ví dụ để giải phóng bộ nhớ của mảng A sử dụng câu lệnh free(A);
Trong ngôn ngữ lập trình C++
Rất đơn giản, bạn có thể sử dụng từ khóa new
để cấp phát động cho mảng, cụ thể như sau,
int n = 10; // n là số phần tử của mảng
int *A = new int[n]; // Cấp phát bộ nhớ cho mảng số nguyên có n phần tử
float *A = new float[n]; // Cấp phát bộ nhớ cho mảng số thực có n phần tử
Để giải phóng bộ nhớ đã cấp phát cho mảng, dùng từ khóa delete
như sau,
delete []A;