▪ Có thể chỉ định vùng mới cho 1 con trỏ quản lý bằng các lệnh hàm malloc, calloc
(của C) hoặc toán tử new (của C++)
▪ Vùng nhớ do lập trình viên chỉ định phải được giải phóng bằng hàm free (của C) hoặc toán tử delete (của C++))
Ví dụ: int *i = new int;
Cấp phát bộ nhớ động
▪ Hàm malloc (memory allocation) và calloc (contiguous allocation) cho phép cấp phát các vùng nhớ ngay trong lúc chạy chương trình.
Cấp phát bộ nhớ động
▪ Toán tử sizeof: nhận một tham số là bất kỳ kiểu dữ liệu nào và trả về kích cỡ của kiểu dữ liệu đó. ▪ Ví dụ: cout<< sizeof(char); // 1 cout<< sizeof(int); // 4 cout<< sizeof(float); // 4 cout<< sizeof(double); // 8
trả về kích cỡ của cáckiểu dữ liệutrong C
trả về kích cỡ của các con trỏ tớicáckiểu dữ liệukhác nhau cout<< sizeof(char*); // 4
cout<< sizeof(int*); // 4 cout<< sizeof(float*); // 4 cout<< sizeof(double*); // 4
Cấp phát bộ nhớ động
▪ malloc: Hàm malloc() thực hiện cấp phát bộ nhớ bằng cách chỉ định số byte cần cấp phát.
Hàm này trả về con trỏ kiểu void cho phép chúng ta có thể ép kiểu về bất cứ kiểu dữ liệu nào (trả về NULL nếu không đủ bộ nhớ)
void* malloc (size_t size);
Ví dụ:
int *a = (int *) malloc(sizeof( int )); // cấp phát 4 bytes
int *arr = (int *) malloc( 10 * sizeof( int )); // cấp phát 40 bytes
float *b = (float *) malloc(100*sizeof(float)); // cấp phát 400 bytes
Cấp phát bộ nhớ động
▪ calloc: hàm calloc() thực hiện cấp phát bộ nhớ gồm num phần tử và khởi tạo tất cả các ô nhớ có giá trị bằng 0 (trả về NULL nếu không đủ bộ nhớ).
void* calloc (size_t num, size_t size); Ví dụ:
int *b = (int *) calloc(10, sizeof( int ));int *a = (int *) calloc(1, sizeof( int )); int *a = (int *) calloc(1, sizeof( int ));