Malloc Là Gì

  -  

Tổng quan

Chođếnthờiđiểmnàythìchúngtađãbiếtlàtêncủamộtmảngthật ra là một con trỏ trỏtới phần tửđầu tiên của mảng. Hơnnữa, ngoài cách định nghĩa một mảng thông thườngcóthểđịnhnghĩa mộtmảng như là một biến con trỏ. Tuy nhiên, nếu một mảng được khai báo một cách bìnhthường, kết quảlà một khối bộ nhớ cố định được dành sẵn tại thời điểm bắt đầu thực thi chương trình,trong khi điềunày không xảy ra nếu mảng được khai báo như là một biến con trỏ. Sử dụng một biến contrỏ để biểudiễn một mảng đòi hỏi việc gán một vài ô nhớ khởi tạo trước khi các phần tử mảng đượcxử lý. Sự cấpphát bộ nhớ như vậy thông thường được thực hiện bằng cách sử dụng hàm thư viện malloc().

Bạn đang xem: Malloc là gì

Xét mộtví dụ là một mảng số nguyên một chiều ary có 20 phần tử có thể được khai báolàint *ary; thay vìint ary<20>;

Tuy nhiên, ary sẽ không được tự động gán một khối bộ nhớ khi nó được khai báo như làmột biến contrỏ, trong khi một khối ô nhớ đủ để chứa 10 số nguyên sẽ được dành sẵn nếu ary đượckhai báo như làmột mảng. Nếu ary được khai báo như là một con trỏ, số lượng bộ nhớ có thể được gánnhư sau:ary = malloc(20 *sizeof(int));

Thao tác này dẫn đến trình biên dịchdành một khối bộ nhớ có kích thước (tính theo byte) tương đương với kích thước củamột sốnguyên. Ở đây, một khối bộ nhớ cho 20 số nguyên được cấp phát. 20 con số gán với 20bytes (mộtbyte cho một số nguyên) và được nhân với sizeof(int), sizeof(int) sẽ trả về kết quả 2,nếu máy tínhdùng 2 bytes để lưu trữ một số nguyên. Nếu một máy tính sử dụng 1 byte để lưu một sốnguyên, hàmsizeof() không đòi hỏi ở đây. Tuy nhiên, sử dụng nó sẽ tạo khả năng uyển chuyển cho mãlệnh. Hàmmalloc() trả về một con trỏ chứa địa chỉ vị trí bắt đầu của vùng nhớ được cấp phát. Nếukhông gian bộnhớ yêu cầu không có, malloc() trả về giá trị NULL. Sự cấp phát bộ nhớ theo cách này, nghĩa là, khiđược yêu cầu trong một chương trình được gọi là Cấp phát bộ nhớ động.

Trước khi tiếp tục, chúng ta hãy thảo luận về khái niệm Cấp phát bộ nhớ động. Một chươngtrình C có thể lưu trữ các thông tin trong bộ nhớ của máy tính theo hai cách chính.Phương pháp thứnhất bao gồm các biến toàn cục và cục bộ - bao gồm các mảng. Trong trường hợp cácbiến toàn cục vàbiến tĩnh, sự lưu trữ là cố định suốt thời gian thực thi chương trình. Các biến này đòi hỏingười lậptrình phải biết trước tổng số dung lượng bộ nhớ cần thiết cho mỗi trường hợp. Phương pháp thứ hai,thông tin có thể được lưu trữ thông qua Hệ thống cấp phát động của C. Trong phươngpháp này, sựlưu trữ thông tin được cấp phát từ vùng nhớ còn tự do và khi cần thiết.

Hàmmalloc()

malloc() là một trong các hàm cấp phát vùng nhớthường được dùng nhất, nó cho phép thực hiện việccấp phát bộnhớ từ vùng nhớ còn tự do.Tham số của malloc() là một số nguyên xác định số byte cần thiết.

Một ví dụ khác, xét mảng ký tự hai chiều ch_ary có 10 dòng và 20 cột. Sự khai báo vàcấp phát bộnhớ trong trường hợp này phải như sau:

char (*ch_ary)<20>;ch_ary = (char*)malloc(10*20*sizeof(char));Như đã nói ở trên, malloc() trả về một con trỏ trỏ đến kiểu rỗng (void). Tuy nhiên, vìch_ary là mộtcon trỏ kiểu char, sự chuyển đổi kiểu là cần thiết. Trong câu lệnh trên, (char*) đổi kiểutrả về củamalloc() hành một con trỏ trỏ đến kiểu char.

Tuy nhiên, nếu sự khai báo của mảng phải chứa phép gán các giá trị khởi tạo thì mảngphải được khaibáo theo cách bình thường, không thể dùng một biến con trỏ:

int ary<10> = {1,2,3,4,5,6,7,8,9,10};//hoc:int ary<> = {1,2,3,4,5,6,7,8,9,10};Ví dụ sau đây tạo một mảng một chiều và sắp xếp mảng theo thứ tự tăng dần. Chươngtrình sử dụngcon trỏ và hàm malloc() để gán bộ nhớ.

#includestdio.h>#includemalloc.h>main() { int *p, n, i, j, temp; printf("\nNhap so luong phan tu ban muon lam viec: "); scanf("%d", &n); p = (int*)malloc(n * sizeof(int)); for(i = 0; i n; ++i) { printf("\nPhan tu thu %d: ", i + 1); scanf("%d", p + i); } //Sp xếp tăng dn: for(i = 0; i n - 1; ++i) for(j = i + 1; j n; ++j) if(*(p + i) > *(p + j)) { temp = *(p + i); *(p + i) = *(p + j); *(p + j) = temp; } printf("\nSau khi sap xep tang dan, ta duoc:\n"); for(i = 0; i n; ++i) printf("%d\n", *(p + i)); return 0;}Chú ý lệnh p = (int*)malloc(n*sizeof(int)); .Ở đây, p được khai báo như một con trỏ trỏ đến một mảng và được gán bộ nhớ sử dụngmalloc().

Xem thêm: Nghĩa Của Từ Menstrual Là Gì, Nghĩa Của Từ Menstrual Trong Tiếng Việt

Dữ liệu được đọc vào sử dụng hàmscanf():scanf("%d",p+i);

Trong scanf(), biến con trỏ được sử dụng để lưu dữ liệu vào trong mảng.

Các phần tử mảng đã lưu trữ được hiển thị bằng hàmprintf():printf("%d\n", *(p + i));

Chú ý dấu * trong trường hợp này, vì giá trị lưu trong vị trí đó phải được hiển thị. Khôngcó dấu *,printf() sẽ hiển thị địa chỉ.

Hàmfree()

Hàm này có thể được sử dụng để giải phóng bộ nhớ khi nó không còn cần thiết.

Dạng tổng quát của hàm free():void free( void *ptr );

Hàm free() giải phóng không gian được trỏ bởi ptr, không gian được giải phóng này cóthể sử dụngtrong tương lai. ptr đã sử dụng trước đó bằng cách gọi đến malloc(), calloc(), hoặcrealloc().

Ví dụ bên dưới sẽ hỏi bạn có bao nhiêu số nguyên sẽ được bạn lưu vào trong một mảng.Sau đó sẽ cấpphát bộ nhớ động bằng cách sử dụng malloc và lưu số lượng số nguyên, in chúng ra, vàsau đó xóa bộnhớ cấp phát bằng cách sử dụng free.

#include stdio.h>#include stdlib.h> //thư vin cha các hàm malloc và freeint main() { int number; int *ptr; int i; printf("Ban muon luu tru bao nhieu so nguyen? "); scanf("%d", &number); ptr = (int *) malloc (number * sizeof(int)); //cp phát vùng nh if(ptr != NULL) { for(i = 0; i number; i++) { *(ptr+i) = i; } for(i=number ; i>0 ; i--) { printf("%d\n", *(ptr+(i-1))); //in ra màn hình theo th t ngược } free(ptr); //gii phóng vùng nh return 0; } else { printf("\nCap phat vung nho khong thanh cong - khong du vung nho.\n"); return 1; }}Kết quả sẽ lànhư sau nếu giá trị được nhập vào là3:

*

Hàmcalloc()

calloc tương tự như malloc, nhưng khác biệt chính là mặc nhiên các giá trị được lưutrong không gianbộ nhớ đã cấp phát là 0. Với malloc, cấp phát bộ nhớ có thể có giá trị bất kỳ.

Xem thêm: Mã Bưu Điện Tphcm Là Gì - Mã Bưu Điện (Zip Code) Việt Nam

calloc yêu cầuhai đối số. Đối số thứ nhất là số các biến mà bạn muốn cấp phát bộ nhớcho. Đối số thứhai là kích thước của mỗi biến.