Đề XuấT, 2024

Editor Choice

Sự khác biệt giữa malloc và calloc

Sự khác biệt cơ bản giữa hàm malloc và hàm calloc là calloc () cần hai đối số thay vì một đối số được yêu cầu bởi malloc () . Cả malloc () và calloc () là các hàm mà ngôn ngữ lập trình C cung cấp cho cấp phát bộ nhớ động và phân bổ lại bộ nhớ trong thời gian chạy.

Trước khi hiểu các hàm malloc () và calloc () trước tiên chúng ta hãy hiểu ý nghĩa của phân bổ bộ nhớ động. Cấp phát bộ nhớ là thủ tục gán bộ nhớ máy tính để thực hiện các chương trình và quy trình. Chúng tôi sử dụng các kỹ thuật phân bổ động khi chưa biết trước cần bao nhiêu dung lượng bộ nhớ cho chương trình và quy trình.

Phân bổ bộ nhớ động phát sinh do các vấn đề liên quan đến cấp phát bộ nhớ tĩnh, chẳng hạn như nếu lưu trữ ít phần tử hơn, thì phần còn lại của bộ nhớ bị lãng phí không cần thiết. Do đó, nó khắc phục các vấn đề về cấp phát bộ nhớ tĩnh trong đó bộ nhớ chỉ được cấp phát khi được yêu cầu.

Biểu đồ so sánh

Cơ sở so sánhmalloc ()calloc ()
Không có khốiChỉ định khối duy nhất của bộ nhớ yêu cầu.
Chỉ định nhiều khối của bộ nhớ được yêu cầu.
Cú phápvoid * malloc (kích thước size_t);void * calloc (size_t num, size_t size);
Khởi tạomalloc () không xóa và khởi tạo bộ nhớ được phân bổ.Bộ nhớ được phân bổ được khởi tạo về 0 bằng cách sử dụng calloc ().
Cách thức phân bổHàm malloc () phân bổ bộ nhớ có kích thước 'size' từ heap.Hàm calloc () phân bổ bộ nhớ kích thước bằng với kích thước num *.
Tốc độNhanhSo sánh chậm.

Định nghĩa của malloc ()

Hàm malloc gán một khối bộ nhớ theo byte . Người dùng nên cung cấp kích thước khối một cách rõ ràng, nó yêu cầu sử dụng.

Thông qua chương trình chức năng malloc yêu cầu RAM của hệ thống để cấp phát bộ nhớ, nếu yêu cầu bị thừa nhận (nghĩa là chức năng malloc cho biết thành công trong việc cấp phát bộ nhớ), nó sẽ trả về một con trỏ tới khối bộ nhớ đầu tiên. Nó trả về loại con trỏ rỗng, có nghĩa là bất kỳ loại con trỏ nào cũng có thể được chỉ định.

Mặc dù, nó trả về NULL, nếu các hàm malloc không thể phân bổ lượng bộ nhớ cần thiết. Hàm malloc có thể truy cập được trong TURBO C, tệp tiêu đề alloc.h hoặc stdlib.h và trên UNIX, nó sẽ có sẵn trong tệp tiêu đề .

Đồng bộ

Cú pháp của hàm này như sau:

malloc(number of elements * size of each element);

ví dụ,
int *ptr;
ptr=malloc(10*sizeof (int))

Trong đó kích thước đại diện cho kích thước của bộ nhớ cần theo byte (nghĩa là số lượng vị trí bộ nhớ liền kề sẽ được phân bổ).

Nhưng như đã đề cập trước đó, hàm malloc trả về một con trỏ rỗng, do đó, một toán tử cast được yêu cầu thay đổi loại con trỏ trả về dựa trên nhu cầu của chúng ta, khai báo trên có thể được trình bày dưới dạng sau:

ptr_var=(type_cast* ) malloc (size)

Trong đó ptr_var là tên của con trỏ giữ lại địa chỉ bắt đầu của khối bộ nhớ được phân bổ, type_cast là kiểu dữ liệu mà con trỏ được trả về (hoặc loại void) sẽ được chuyển đổi và kích thước mô tả kích thước của khối bộ nhớ được phân bổ theo byte .

Ví dụ:
int *ptr;
ptr=(int*) malloc (10 * size of (int));

Bộ nhớ được phân bổ bởi hàm malloc chứa giá trị rác .

Lưu ý rằng để xác minh rằng nếu yêu cầu tương ứng được tạo bởi malloc để phân bổ bộ nhớ được cấp bởi RAM hệ thống hoặc bị từ chối (trong trường hợp nếu không có không gian yêu cầu). Chúng ta có thể sử dụng thuộc tính trong đó lượng bộ nhớ cần thiết không được gán, hàm malloc trả về NULL.

Định nghĩa của calloc ()

Hàm calloc hoạt động chính xác giống như hàm malloc loại trừ thực tế là nó yêu cầu hai đối số như trong trường hợp malloc () chỉ cần một đối số.

Ví dụ:
int*ptr;
ptr = (int*)calloc(10, 2);

Ở đây 2 chỉ định kích thước của kiểu dữ liệu trong một byte mà chúng tôi muốn phân bổ được thực hiện, trường hợp này là 2 cho số nguyên. Và 10 biểu thị số lượng phần tử sẽ được phân bổ.

Hãy nhớ rằng đối số được truyền cho hàm malloc là (n * 10), đó là một đối số duy nhất không bị nhầm lẫn vì nhiều đối số luôn được phân tách bằng dấu phẩy. Đối số (n * 10) không có dấu phẩy ở giữa. Do đó, nó là một đối số duy nhất, mặc dù không phải là một đối số đơn giản mà là một biểu thức.

Quay trở lại khai báo trên, sau khi thực hiện câu lệnh trên, khối bộ nhớ 20 byte được cấp cho chương trình yêu cầu và địa chỉ của khối đầu tiên được gán cho chương trình yêu cầu và địa chỉ của khối đầu tiên được gán cho con trỏ ptr.

Bộ nhớ được phân bổ bởi chức năng calloc giữ tất cả các số không. Hàm calloc cũng có thể lấy được trong tệp tiêu đề hoặc là trong TURBO C.

Sự khác biệt chính giữa malloc và calloc

Sự khác biệt chính giữa chức năng malloc và calloc là:

  1. Một khối bộ nhớ theo yêu cầu được gán trong malloc trong khi nhiều khối bộ nhớ được yêu cầu được phân bổ bởi calloc.
  2. Hàm malloc không xóa và khởi tạo bộ nhớ được phân bổ. Nó chứa giá trị rác và mục của bộ nhớ được phân bổ không thể thay đổi. Ngược lại, calloc khởi tạo bộ nhớ được phân bổ về 0.
  3. malloc nhanh hơn calloc do yêu cầu của các bước khởi tạo bổ sung trong calloc nhưng sự khác biệt là không đáng kể.
  4. Một điểm khác biệt giữa hai điều này là calloc là một malloc + memset, memset phân bổ các trang vật lý trong bộ nhớ trong khi malloc chỉ gán bộ nhớ từ heap trong địa chỉ ảo.

Phần kết luận:

Cả hai hàm malloc và calloc đều được sử dụng để cấp phát bộ nhớ và có ưu điểm nhất định, và nhược điểm như malloc là nhanh so với calloc. Hơn nữa, malloc dễ sử dụng hơn vì chỉ cần một đối số vì calloc phân bổ bộ nhớ và khởi tạo vùng nhớ với ZERO. Nhưng bạn muốn sử dụng calloc khi khởi tạo biến quan trọng hơn đối với bạn.

Top