Bộ nhớ động có lợi hơn bộ nhớ tĩnh rất nhiều, có thể cấp phát thêm hoặc thu hồi lại bộ nhớ. Do đó, bộ nhớ động rất linh hoạt và tiết kiệm hơn so với sử dụng bộ nhớ tĩnh. Một mảng động chứa các phần tử được cấp phát bộ nhớ động, do đó có thể thêm phần tử, xoá phần tử,... nên quản lý bộ nhớ hiệu quả hơn.
Ngôn ngữ C cung cấp cho chúng ta 4 hàm: malloc, calloc , realloc để cấp phát và freeđể thu hồi. C++ cung cấp 2 toán tử: new để cấp phát và delete để thu hồi. Do C/C++ không có chế độ thu hồi tự động nên khi ta cấp phát động thì ta phải có thu hồi bộ nhớ động.
Trong C, bốn hàm malloc, calloc, realloc và free nằm trong thư viện stdlib.h hoặcalloc.h, trước khi sử dụng các bạn phải khai báo thư viện này.
Hàm malloc
Cú pháp:
Ý nghĩa: Cấp phát vùng nhớ động có kích thức
Để đảm bảo cấp phát đủ bộ nhớ cho một mảng, ta thường sử dụng
Với một mảng có kiểu dữ liệu xác định nên ta phải ép kiểu để phù hợp với kiểu dữ liệu của mảng.
Hàm
Ví dụ:
Code C:
Hàm calloc
Cú pháp:
Ý nghĩa: Cấp phát mảng động có
Tương tự hàm
Ví dụ:
Code C:
Hàm realloc
Cú pháp:
Ý nghĩa: Thay đổi kích thước vùng nhớ được trỏ bởi con trỏ
Ví dụ:
Hàm free
Cú pháp:
Ý nghĩa: Giải phóng vùng nhớ trỏ bởi con trỏ
Phải luôn nhớ giải phóng bộ nhớ động khi không dùng đến nữa.
Ví dụ:
Toán tử new và detete trong C++
Để cấp phát động một biến có thể dùng như sau:
Ví dụ:
Cấp phát cho một mảng n phần tử có thể dùng như sau:
Ví dụ:
Thu hồi một biến:
Thu hồi một mảng:
Ngôn ngữ C cung cấp cho chúng ta 4 hàm: malloc, calloc , realloc để cấp phát và freeđể thu hồi. C++ cung cấp 2 toán tử: new để cấp phát và delete để thu hồi. Do C/C++ không có chế độ thu hồi tự động nên khi ta cấp phát động thì ta phải có thu hồi bộ nhớ động.
Trong C, bốn hàm malloc, calloc, realloc và free nằm trong thư viện stdlib.h hoặcalloc.h, trước khi sử dụng các bạn phải khai báo thư viện này.
Hàm malloc
Cú pháp:
void* malloc(size_t size);
Ý nghĩa: Cấp phát vùng nhớ động có kích thức
size
byte.Để đảm bảo cấp phát đủ bộ nhớ cho một mảng, ta thường sử dụng
malloc(n*sizeof(data_type))
với n
là số phần tử. Toán tử sizeof(kiểu_dữ_liệu)
trả về kích thước của kiểu dữ liệu (do kích cỡ một kiểu dữ liệu không cố định ở những kiến trúc máy tính khác nhau).Với một mảng có kiểu dữ liệu xác định nên ta phải ép kiểu để phù hợp với kiểu dữ liệu của mảng.
Hàm
malloc
chỉ cấp phát mà không khởi tạo giá trị ban đầu cho các biến.Ví dụ:
Code C:
1 2 3 4 5 | //cấp phát mảng động kiểu int với 5 phần tử int *p = ( int *) malloc (5* sizeof ( int )); //cấp phát chuỗi động có 11 phần tử char *str = ( char *) malloc (11* sizeof ( char )); |
Hàm calloc
Cú pháp:
void* calloc(size_t num, size_t size);
Ý nghĩa: Cấp phát mảng động có
num
phần tử có kích thước size
byte.Tương tự hàm
malloc
, ta cũng cần ép kiểu cho phù hợp với kiểu dữ liệu mảng. Sau khi cấp phát, các phần tử sẽ được gán giá trị 0.Ví dụ:
Code C:
1 2 | int *p = ( int *) calloc (5, sizeof ( int )); char *str = ( char *) calloc (11, sizeof ( char )); |
Hàm realloc
Cú pháp:
void* realloc(void *ptr, size_t size);
Ý nghĩa: Thay đổi kích thước vùng nhớ được trỏ bởi con trỏ
ptr
với kích thước mới làsize
byte.Ví dụ:
1 2 | int *p = ( int *) malloc (5* sizeof ( int )); int *q = ( int *) realloc (p, 10* sizeof ( int )); |
Hàm free
Cú pháp:
void free(void *p);
Ý nghĩa: Giải phóng vùng nhớ trỏ bởi con trỏ
p
.Phải luôn nhớ giải phóng bộ nhớ động khi không dùng đến nữa.
Ví dụ:
1 2 | int *a = ( int *) malloc (512); free (a); |
Toán tử new và detete trong C++
Để cấp phát động một biến có thể dùng như sau:
Ví dụ:
1 2 | //Cấp phát một chuỗi chưa biết số lượng phần tử char *str = new char (); |
Cấp phát cho một mảng n phần tử có thể dùng như sau:
Ví dụ:
1 | int *a = new int [n]; |
Thu hồi một biến:
1 | delete a; //thu hồi vùng nhớ của con trỏ a |
Thu hồi một mảng:
1 | delete []a; //thu hồi mảng a
|
Nhận xét
Đăng nhận xét