1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo btl kĩ thuật lập trình 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ớ

14 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề 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ớ
Tác giả Lê Minh Nghĩa
Người hướng dẫn TS. Vũ Đức Vượng
Trường học Trường Đại học Bách Khoa Hà Nội
Chuyên ngành Kĩ Thuật Lập Trình
Thể loại Báo cáo BTL
Năm xuất bản 2021
Thành phố Hà Nội
Định dạng
Số trang 14
Dung lượng 1,7 MB

Nội dung

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 1

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ớ

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 2

2

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 3

1, Đặ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 4

4

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 5

2 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 6

Nế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 7

Output:

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 8

8

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 9

int 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 10

10

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 11

Hà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 12

12

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 13

Chươ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 14

14

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ô !

Ngày đăng: 11/06/2024, 17:42

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w