Cấp Phát Bộ Nhớ Động

     

Trong bài hôm nay chúng ta đang học cấp phép động bộ lưu trữ với malloc, calloc với realloc, Đây là các hàm giúp chúng ta cấp phát cùng giải phóng bộ lưu trữ khi thao tác làm việc với con trỏ trong ngôn ngữ C.

Bạn đang xem: Cấp phát bộ nhớ động

Bài 17 vào Serie học tập lập trình C trường đoản cú A tới Z


Cấp phát bộ nhớ lưu trữ là gì? tại sao cần cấp phát động bộ nhớ

Chúng ta đang biết, từng khi tạo thành một phát triển thành nào đó, trình biên dịch sẽ đưa ra 1 địa chỉ cửa hàng để lưu giữ giữ đổi mới đó. Khi họ sử dụng biến rất có thể truy cập bởi tên đổi mới hoặc bé trỏ.Việc cấp phát như vậy hotline là cấp phát tĩnh. 

Khi cấp phát tĩnh, ô nhớ đó sẽ tồn trên từ lúc chương trình vận động tới khi công tác kết thucs

Giả sử bạn phải khai báo 1 mảng mà không rõ đề nghị sử dụng kích thước là bao nhiêu. Vậy thì nếu cấp phát tĩnh bộ nhớ lưu trữ cho mảng kia sẽ xảy ra 2 vấn đề:

Thiếu kích cỡ dẫn tới lưu giữ thiếu dữ liệuThừa kích cỡ dẫn tới tiêu tốn lãng phí bộ nhớ

Vậy nên chúng ta phải sử dụng cấp phép động trong trường hòa hợp này.

Cấp phát động bộ nhớ lưu trữ chính là bài toán cấp phát/giải phóng, biến hóa kích thước bộ nhớ lưu trữ một phương pháp linh hoạt. Giúp chúng ta điều khiển được việc sử dụng bộ lưu trữ của chương trình.Thế nhưng cấp phép động không xuất sắc (không giải phóng ô nhớ) sẽ khiến cho chương trình gặp gỡ lỗi tràn bộ nhớ Memory leak, vậy đề nghị hãy cẩn trọng khi thực hiện nhé.

Cấp phát động và cấp phép tĩnh

Vậy cấp phát tĩnh và cấp phát động kiểu như và không giống nhau như rứa nào

Cấp phát bộ nhớ tĩnhCấp phát bộ nhớ động
Bộ ghi nhớ được cung cấp phát trước khi chạy công tác (trong quá trình biên dịch)Bộ nhớ được cấp phát trong quá trình chạy chương trình.
Không thể cấp phát hay phân bổ lại bộ lưu trữ trong lúc chạy chương trìnhCho phép cai quản lý, phân bổ hay giải phóng bộ nhớ lưu trữ trong khi chạy chương trình
Vùng nhớ được cấp phát và tồn tại cho tới khi chấm dứt chương trìnhChỉ cấp phát vùng nhớ lúc cần sử dụng tới
Chương trình chạy cấp tốc hơn so với cấp phát độngChương trình chạy chậm hơn so với cấp phép tĩnh
Tốn nhiều không gian bộ nhớ lưu trữ hơnTiết kiệm được ko gian bộ lưu trữ sử dụng

Để cấp phát vùng nhớ động mang đến biến con trỏ trong ngữ điệu C, chúng ta có thể sử dụng hàm malloc() hoặc hàm calloc(). Thực hiện hàm free() để giải phóng bộ lưu trữ đã cấp phép khi không yêu cầu sử dụng, sử dụng realloc() để biến đổi (phân bổ lại) kích thước bộ lưu trữ đã cung cấp phát trong những lúc chạy chương trình.

*

Sử dụng hàm free

Việc cấp cho phát bộ nhớ lưu trữ động vào C mặc dù sử dụng malloc() hay calloc() thì chúng cũng mọi không thể tự giải phóng cỗ nhớ. Bạn cần sử dụng hàm free() để giải phóng vùng nhớ.

Cú pháp:

free(ptr);//ptr là bé trỏ


Lệnh này vẫn giải phóng vùng ghi nhớ mà con trỏ ptr đã được cung cấp phát. Hóa giải ở đây có nghĩa là trả lại vùng nhớ đó cho hệ điều hành quản lý và hệ điều hành rất có thể sử dụng vùng nhớ kia vào bài toán khác trường hợp cần.

Xem thêm: Câu Hỏi Trắc Nghiệm Lịch Sử 7 Violet Mới Nhất 2022, Trắc Nghiệm Lịch Sử 7 Bài 19


Sử dụng hàm malloc

Từ malloc là thay mặt đại diện cho các từ memory allocation (dịch: cấp phép bộ nhớ). Khi khai báo kiểu malloc, các ô nhớ đang được không thay đổi bộ nhớ thuở đầu (draf data hay tài liệu rác).

Hàm malloc được có mang như sau


Kiểu trả về là bé trỏ void (không có mức giá trị), tham số truyền vào là size tính bởi byte

VD:

int *pt = malloc(10* sizeof(int));Cấp phát con trỏ phong cách int, với kích thước là 10*4 = 40 byte. Do 1 int có form size 4 byte.

Vậy thì khai báo như vậy nhỏ trỏ pt sẽ tiến hành cấp đến 40byte tương xứng với 10 phần tử trong mảng.

#include int main() int *pt = malloc(10* sizeof(int)); pt<0> = 1; pt<1> = 2; pt<2> = 3; pt<3> = 4; pt<4> = 5; pt<5> = 6; pt<6> = 7; pt<7> = 8; pt<8> = 9; pt<9> = 10; free(pt);Vì hàm malloc trả về dạng void, vậy nên bọn họ nên nghiền kiểu mang đến nó trở về đúng kiểu bé trỏ mà họ sử dụng, như sau:

Cú pháp:


VD: cấp phát bộ lưu trữ và ghi dữ liệu vào mảng nhỏ trỏ

#include int main() int *pt = calloc(10, sizeof(int)); pt<0> = 1; pt<1> = 2; pt<2> = 3; pt<3> = 4; pt<4> = 5; pt<5> = 6; pt<6> = 7; pt<7> = 8; pt<8> = 9; pt<9> = 10; free(pt);Cấp phát bộ lưu trữ có 10 phần tử kiểu int, sau đó ghi vào theo kiểu truy cập phần tử mảng.

VD:

#include #include // thư viện này để cấp cho phát bộ lưu trữ độngint main(){ int n, i, *ptr, sum = 0; printf("Nhap so luong phan tu: "); scanf("%d", &n); ptr = (int *)calloc(n, sizeof(int)); // còn nếu không thể cung cấp phát, // hàm malloc đã trả về con trỏ NULL if (ptr == NULL) printf("Co loi! khong the cap phat bo nho."); exit(0); for (i = 0; i tương tự như là nhập số phần tử và tính tổng các bộ phận mà thôi

Sử dụng hàm realloc

Hàm realloc được sử dụng khi bạn đã cấp phép động bộ lưu trữ nhưng thấy thiếu, cần cấp phép thêm bộ nhớ lưu trữ để sử dụng.

Xem thêm: Uống Nước Dứa Có Nóng Không ? Tác Dụng Của Dứa Với Sức Khỏe Là Gì

Cú pháp:


VD: Nhập thêm con số phẩn tử vào tổng đã có

#include #include // tủ sách này để cấp cho phát bộ nhớ độngint main(){ int n, i, *ptr, sum = 0; printf("Nhap so luong phan tu: "); scanf("%d", &n); ptr = (int *)calloc(n, sizeof(int)); // nếu như không thể cung cấp phát, // hàm malloc đang trả về bé trỏ NULL if (ptr == NULL) printf("Co loi! khong the cap phat bo nho."); exit(0); for (i = 0; i Kết quả

Nhap so luong phan tu: 3Nhap gia tri 1: 1Nhap gia tri 2: 2Nhap gia tri 3: 3Tong = 6Them so luong phan tu: 2Nhap gia tri 4: 3Nhap gia tri 5: 5Tong moi = 14

Kết 

Việc thực hiện phương thức calloc sẽ an ninh hơn malloc trong lập trình bởi vì vùng nhớ cấp phép động sẽ tiến hành gán giá chỉ trị bằng 0 thay bởi vì giá trị rác rến như calloc. Tuy vậy việc thêm một bước gán giá trị các ô nhớ bằng 0 này cũng biến thành khiến nó bị chậm trễ hơn so với malloc vì phải thực hiện thêm thao tác.

Sử dụng realloc và không tính phí một giải pháp linh hoạt vẫn giúp các bạn điều khiển sự tăng giảm của cục nhớ 1 cách dễ dàng

Nếu thấy có lợi hãy chia sẻ nội dung bài viết và gia nhập nhóm Nghiện Lập Trình để giao giữ và giao lưu và học hỏi nhé