TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ N I ỘVIỆN CÔNG NGH THÔNG TIN & TRUY N THÔNG Ệ ỀTên đề tài: Tìm hiểu về hàm malloc, calloc, free trong C để hiểu hơn về cung cấp bộ nhớ và giải phóng bộ nhớ G
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ N I Ộ
VIỆN CÔNG NGH THÔNG TIN & TRUY N THÔNG Ệ Ề
Tên đề tài: Tìm hiểu về hàm malloc(), calloc(), free() trong C để hiểu
hơn về cung cấp bộ nhớ và giải phóng bộ nhớ
Gi ng viên: TS V ả ũ Đức Vượng
Sinh viên th c hiự ện: Lê Minh Nghĩa – MSSV: 20183960 L p: – ớ 124162
Hà Nội, tháng 6 năm 2021
Trang 22
1 Đặ ấn đềt v ………3
2 Tìm hi u hàm malloc() trong Cể ……….5
3 Tìm hi u v hàm calloc() trong Cể ề ……… 8
4 So sánh gi a hàm malloc() và calloc()ữ ………10
5 Tìm hi u v hàm free()ể ề ……….12
6 Danh m c tham khụ ảo ……… 14
Trang 31, Đặt v ấn đề :
Vì C là m t ngôn ng có cộ ữ ấu trúc, nó có m t s quy t c c ộ ố ắ ố định để ập l trình M t trong s ộ ố đó bao gồm thay đổi kích thước của một m ng Mả ột m ng là ả tập h p các ph n t ợ ầ ử được lưu trữ ạ t i các v trí b nh liên tị ộ ớ ục
Ta có ví d v mụ ề ột mảng trong C
Như có thể thấy rằng chiều dài (kích thước) của mảng trên được thực hiện là
9 Nhưng nếu có yêu cầu thay đổi độ dài (kích thước) này Ví dụ,
• Nếu có một tình huống chỉ cần nhập 5 phần tử vào mảng này Trong trường hợp này, 4 phần tử còn lại chỉ làm lãng phí bộ nhớ trong mảng này Vì vậy,
có một yêu cầu để giảm chiều dài (kích thước) của mảng từ 9 xuống 5
• Lấy tình huống khác Trong đó, có m t m ng g m 9 ph n t v i t t c 9 ch ộ ả ồ ầ ử ớ ấ ả ỉ
số được điền Nhưng cần ph i nh p thêm 3 ph n t vào m ng này Trong ả ậ ầ ử ả trường h p này, 3 ph n t ợ ầ ử được yêu cầu nhiều hơn kích thước mảng Vì vậy, chiều dài (kích thước) của mảng cần phải thay đổ ừ 9 đếi t n 12
•
Th tủ ục này trong C được gọi là Dynamic Memory Allocation ( c p phát b ấ ộ nhớ động)
Trang 44
C cung cấp một số chức năng để đạt được các nhiệm vụ này Có 4 hàm thư viện được cung cấp bởi C được xác định trong tệp tiêu đề <stdlib.h> để tạo điều
kiện cấp phát bộ nhớ động trong lập trình C 4 hàm đó là:
1 malloc ()
2 calloc ()
3 free()
4 realloc ()
Bây giờ chúng ta cùng đi tìm hiểu chi tiết đại diện là các hàm: malloc(), calloc(), free()
Trang 52 Tìm hiểu hàm malloc () trong C
“Malloc” là phương pháp trong C được sử dụng để tự động cấp phát một vùng
nhớ duy nhất của bộ nhớ với kích thước nhất định Nó trả về một con trỏ kiểu void
có thể được chuyển thành một con trỏ có dạng bất kỳ Nó khởi tạo mỗi vùng nhớ với giá trị “rác” mặc định
Cú pháp khai báo trong C:
ptr = (kieu_du_lieu *) malloc (size);
Ví dụ:
ptr = (int *) malloc ( 20* sizeof(int));
Kích thước của int là 4 byte nên trong câu lệnh này vùng nhớ đc cấp phát là 80 byte bộ nhớ, và con trỏ ptr sẽ nắm giữ địa chỉ của byte đầu tiên trong bộ nhớ được cấp phát
Trang 6Nếu không đủ dung lượng, cấp phát thất bại và con trỏ sẽ được trả về giá trị NULL
Ví dụ:
#include <stdio.h>
#include <stdlib.h>
int main()
{
// con trỏ sẽ giữ địa chỉ cơ sở của vùng nhớ đc cấp phát
int* ptr;
int n, i;
// Số phần tử của mảng
n = 3;
printf("So phan tu cua mang %d\n", n);
// Cấp phát vùng nhớ động cho mảng sử dụng hàm malloc()
ptr = (int*)malloc(n * sizeof(int));
// Kiểm tra vùng nhớ có được cấp phát thành công hay không
if (ptr == NULL) {
printf("Vung nho ko du.\n");
exit(0);
}
else {
// Cấp phát thành công
printf("Vung nho duoc cap phat thanh cong boi ham malloc.\n");
for (i = 0; i < n; ++i) {
ptr[i] = i + 1;
}
// In ra các phẩn tử của mảng
printf("Cac phan tu cua mang: ");
for (i = 0; i < n; ++i) {
printf("%d, ", ptr[i]);
}
}
return 0;
Trang 7Output:
Nhập số phần tử: 3
Vung nho duoc cap phat thanh cong boi ham malloc Các phần tử của mảng là: 1, 2, 3
Trang 88
3 Tìm hiểu về hàm calloc() trong C
“Calloc” là phương pháp trong C được sử dụng để cấp phát động Nó khởi
tạo mỗi khối với giá trị mặc định '0'
Cú pháp khai báo trong C:
ptr = (kieu_du_lieu *) calloc (so_phan_tu, kich_thuoc_phan_tu);
Ví dụ:
ptr= (float * ) calloc (25, sizeof(float));
Câu lệnh này cấp phát vùng nhớ liền kề trong bộ nhớ cho 25 phần tử, mỗi phần tử
có kích thước của float
Nếu không đủ dung lượng, cấp phát thất bại và trả về con trỏ NULL
Ví dụ chương trình minh họa:
#include <stdio.h>
#include <stdlib.h>
int main()
Trang 9int i n , ;
int* ;
printf("Nhap so phan tu: \n");
scanf("%d",& );n
a = (int*)calloc(n,sizeof int( ));
printf("Nhap %d so: \n", );
for( = i 0 i n i; < ; ++ )
{
scanf("%d",&a[i]);
}
printf("Cac so vua nhap la: \n");
for( = i 0 i n i; < ; ++ )
{
printf("%d ",a[i]);
}
return( );0
}
Output:
Nhap so phan tu: 3
Nhap 3 so: 3 4 5
Cac so vua nhap la: 3 4 5
Trang 1010
4 So sánh giữa hàm malloc() và hàm calloc() trong C
❖ Điểm gi ng nhau gi a malloc() và calloc() ố ữ
Cả 2 hàm malloc() và calloc() đều được sử dụng để cấp phát vùng nhớ động cho
chương trình Nếu cấp phát vùng nhớ thành công, hàm trả về con trỏ trỏ tới vùng
nhớ được cấp phát Hàm trả về NULL nếu không đủ vùng nhớ
Hàm malloc() và calloc() trả về NULL trong các trường hợp sau:
▪ Kích thước vùng nh c n cớ ầ ấp phát vượt quá kích thước vật lý của h th ng ệ ố
▪ Tại thời điểm g i hàm malloc() và calloc(), t m thọ ạ ời không đủ vùng nh ớ để
cấp phát Nhưng application có thể gọi l i nhi u lạ ề ần malloc() và calloc() để cấp phát vùng nh thành công ớ
❖ Điểm khác nhau gi a hàm malloc() và calloc() ữ
malloc vi t t t cế ắ ủa memory allocation calloc vi t t t c a contiguous allocation ế ắ ủ
malloc nh n 1 tham s truy n vào là s ậ ố ề ố
byte c a vùng nh c n c p phát ủ ớ ầ ấ
calloc nh n 2 tham s truy n vào là s block và ậ ố ề ố kích thước mỗi block (byte)
void *malloc(size_t n); void *calloc(size_t n, size_t size);
Trang 11Hàm trả về con trỏ trỏ tới vùng nhớ nếu
cấp phát thành công, trả về NULL nếu
cấp phát fail
Hàm trả về con trỏ trỏ tới vùng nhớ được cấp phát và vùng nhớ được khởi tạo bằng giá trị 0 Trả về NULL nếu cấp phát fail
Hàm malloc() nhanh hơn hàm calloc()
Hàm calloc() tốn thêm th i gian kh i t o vùng ờ ở ạ nhớ Tuy nhiên, s khác biự ệt này không đáng kể
Trang 1212
5 Tìm hiểu về hàm free() trong C
Khái niệm: Hàm free() trong C được sử dụng để giải phóng b nh ộ ớ đã được c p ấ phát trước đó bởi một lời gọi tới calloc, malloc, ho c realloc Nó giúp gi m lãng ặ ả phí b nh bộ ớ ằng cách giải phóng nó, và nó được sử dụng b t c khi nào vi c c p ấ ứ ệ ấ phát b nh ộ ớ động di n ra ễ
Cú pháp khai báo trong C:
Void free( *ptr);
Trong đó: ptr là con trỏ tới khối bộ nhớ đã được cấp phát trước đó với malloc, calloc ho c realloc ặ để được gi i phóng N u tham s truy n vào là m t con ả ế ố ề ộ
trỏ null, thì không hành động nào di n ra ễ
Trang 13Chương trình ví dụ:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char*str;
/* lan cap phat bo nho ban bau */
str = (char malloc*) (15);
strcpy(str,"HDH");
printf("Chuoi = %s, tai Dia chi = %u\n", str str , );
/* Giai phong bo nho da cap phat */
free(str);
return( );0
}
Output:
Chuoi= HDH, tai Dia chi = 3825584
Trang 1414
Bài vi t có s dế ử ụng ngu n tài li u t trang GeeksforGeeks, vncoding.net, ồ ệ ừ
vietjack.com, giáo trình l p trình C ậ
Em xin chân thành cảm ơn sự hướng d n c a thẫ ủ ầy cô !