Trước khi tìm hiểu sự khác biệt giữa malloc và calloc, chúng ta hãy tìm hiểu-
Phân bổ bộ nhớ động là gì?
Cấp phát bộ nhớ động là một quá trình cấp phát bộ nhớ tại thời điểm chạy. Có bốn thủ tục thư viện, calloc (), free (), realloc () và malloc () có thể được sử dụng để cấp phát bộ nhớ và giải phóng bộ nhớ trong quá trình thực thi chương trình. Các quy trình này được định nghĩa trong tệp tiêu đề được gọi là stdlib.h.
Malloc () là gì?
Nó là một hàm được sử dụng để cấp phát động một khối bộ nhớ. Nó dự trữ không gian bộ nhớ có kích thước được chỉ định và trả về con trỏ null trỏ đến vị trí bộ nhớ.
Con trỏ trả về thường có kiểu void. Nó có nghĩa là chúng ta có thể gán hàm malloc cho bất kỳ con trỏ nào. Dạng đầy đủ của malloc là cấp phát bộ nhớ.
Trong hướng dẫn này, bạn sẽ học:
- Phân bổ bộ nhớ động là gì?
- Malloc () là gì?
- Calloc () là gì?
- Tại sao sử dụng malloc ()?
- Tại sao sử dụng calloc ()?
- Cú pháp của malloc ()
- Cú pháp của calloc ()
- Ví dụ về malloc () trong C
- Ví dụ về calloc () trong C
- Sự khác biệt giữa calloc () và malloc ()
Calloc () là gì?
Hàm calloc () được sử dụng để cấp phát nhiều khối bộ nhớ. Nó là một chức năng cấp phát bộ nhớ động được sử dụng để cấp phát bộ nhớ cho các cấu trúc dữ liệu phức tạp như mảng và cấu trúc. Nếu hàm này không cấp đủ không gian như đã chỉ định, nó sẽ trả về con trỏ null. Dạng đầy đủ của hàm calloc là phân bổ liền kề.
Tại sao sử dụng malloc ()?
Đây là những lý do sử dụng malloc ()
- Bạn nên sử dụng malloc () khi bạn phải cấp phát bộ nhớ trong thời gian chạy.
- Bạn nên sử dụng malloc khi bạn phải cấp phát các đối tượng phải tồn tại ngoài khả năng thực thi của khối bộ nhớ hiện tại.
- Đi cho malloc () nếu bạn cần cấp phát bộ nhớ lớn hơn kích thước của ngăn xếp đó.
- Nó trả về con trỏ đến byte đầu tiên của không gian được cấp phát.
- Nó cho phép các nhà phát triển phân bổ bộ nhớ khi cần với số lượng chính xác.
- Hàm này phân bổ kích thước khối bộ nhớ là byte từ heap.
Tại sao sử dụng calloc ()?
Đây là những lý do sử dụng calloc ()
- Khi bạn phải đặt bộ nhớ được cấp phát bằng không.
- Bạn có thể sử dụng calloc trả về một con trỏ để có quyền truy cập vào heap bộ nhớ.
- Được sử dụng khi bạn cần khởi tạo các phần tử bằng 0 để trả về một con trỏ vào bộ nhớ.
- Để ngăn chặn tràn có thể xảy ra với malloc ()
- Sử dụng calloc () để yêu cầu một trang được biết là đã bị xóa.
Cú pháp của malloc ()
Đây là cú pháp của malloc ()
ptr = (cast_type *) malloc (byte_size);
Trong cú pháp trên, ptr là một con trỏ của cast_type. Hàm malloc trả về một con trỏ đến vùng nhớ được cấp phát byte_size.
Example: ptr = (int *) malloc (50)
Khi câu lệnh này được thực thi thành công, một không gian bộ nhớ 50 byte sẽ được bảo lưu. Địa chỉ của byte đầu tiên của không gian dành riêng được gán cho con trỏ "ptr" kiểu int.
Cú pháp của calloc ()
Đây là cú pháp của malloc ()
ptr = (cast_type *) calloc (n, size);
Cú pháp trên được sử dụng để cấp phát n khối nhớ có cùng kích thước. Sau khi không gian bộ nhớ được cấp phát, tất cả các byte được khởi tạo bằng không. Con trỏ, hiện đang ở byte đầu tiên của không gian bộ nhớ được cấp phát, được trả về.
Ví dụ về malloc () trong C
Trong đoạn mã dưới đây, sizeof (* ptr) được sử dụng để cấp phát một khối bộ nhớ gồm 15 số nguyên. Trong câu lệnh printf, chúng ta đang tìm giá trị của số nguyên thứ 6.
#include#include int main(){int *ptr;ptr = malloc(15 * sizeof(*ptr));if (ptr != NULL) {*(ptr + 5) = 480;printf("Value of the 6th integer is %d",*(ptr + 5));}}
Đầu ra:
Giá trị của số nguyên thứ 6 là 480
Ví dụ về calloc () trong C
Chương trình ngôn ngữ C dưới đây tính tổng của mười số hạng đầu tiên. Nếu giá trị con trỏ nếu null, thì không gian bộ nhớ sẽ không được cấp phát.
Vòng lặp for được sử dụng để lặp lại giá trị của một biến "i" và in ra tổng. Cuối cùng, chức năng miễn phí được sử dụng để giải phóng con trỏ.
#include#include int main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \n");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}
Đầu ra:
Xây dựng và tính tổng dãy của 10 số hạng đầu tiên n Sum = 45
Sự khác biệt giữa calloc () và malloc ()
Dưới đây là sự khác biệt quan trọng giữa malloc () và calloc ():
malloc () | calloc () |
Hàm Malloc () sẽ tạo một khối bộ nhớ duy nhất có kích thước do người dùng chỉ định. | Hàm calloc () có thể gán nhiều khối bộ nhớ cho một biến. |
Hàm Malloc chứa giá trị rác. | Khối bộ nhớ được cấp phát bởi một hàm calloc luôn được khởi tạo bằng 0. |
Số đối số là 2. | Số đối số là 1. |
Calloc chậm hơn malloc. | Malloc nhanh hơn calloc. |
Nó không an toàn so với calloc. | Nó là an toàn để sử dụng so với malloc. |
Hiệu quả thời gian cao hơn calloc (). | Hiệu quả thời gian thấp hơn malloc (). |
Hàm Malloc () chỉ trả về địa chỉ bắt đầu và không làm cho nó bằng không. | Trước khi cấp phát địa chỉ, hàm Calloc () trả về địa chỉ bắt đầu và biến nó thành 0. |
Nó không thực hiện khởi tạo bộ nhớ. | Nó thực hiện khởi tạo bộ nhớ. |
SỰ KHÁC BIỆT CHÍNH:
- Hàm malloc () chỉ trả về địa chỉ bắt đầu và không làm cho nó bằng không, ngược lại, hàm calloc () trả về địa chỉ bắt đầu và làm cho nó bằng không.
- Trong hàm malloc, số đối số là 2 trong khi trong hàm calloc, số đối số là 1.
- Hiệu quả thời gian malloc () cao hơn calloc () trong khi malloc () không an toàn so với calloc ()
- malloc không khởi tạo bộ nhớ trong khi calloc thực hiện khởi tạo bộ nhớ.