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

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

  • Hàm malloc() chỉ trả về địa chỉ bắt đầu và không biến nó thành 0, mặt khác, hàm calloc() trả về địa chỉ bắt đầu và biến nó thành 0.
  • Trong hàm malloc, số lượng đối số là 1, trong khi ở hàm calloc, số lượng đối số là 2.
  • Hiệu suất sử dụng thời gian của 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ớ.
malloc() so với calloc()
malloc() so với calloc()

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ớ trong thời gian chạy. Có bốn thủ tục thư viện, calloc(), free(), realloc ()và malloc() có thể được sử dụng để phân bổ bộ nhớ và giải phóng bộ nhớ trong quá trình thực thi chương trình. Các thủ tục này được xác định trong tệp tiêu đề có tên stdlib.h.

malloc() là gì?

Đây là một chức năng được sử dụng để phân bổ độ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. Điều đó có nghĩa là chúng ta có thể gán hàm malloc cho bất kỳ con trỏ nào. Hình thức đầy đủ của malloc là cấp phát bộ nhớ.

calloc() là gì?

Hàm Calloc() được sử dụng để phân bổ nhiều khối bộ nhớ. Đây là hàm phân bổ bộ nhớ động được sử dụng để phân bổ 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 phân bổ đủ 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 tiếp.

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

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ớ 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 hàm calloc luôn được khởi tạo bằng 0.
Số lượng đối số là 1. Số lượng đối số là 2.
Calloc chậm hơn malloc. Malloc nhanh hơn calloc.
Nó không an toàn so với calloc. Nó an toàn để sử dụng so với malloc.
Hiệu quả về thời gian cao hơn calloc(). Hiệu quả về thời gian thấp hơn malloc().
Hàm Malloc() chỉ trả về địa chỉ bắt đầu và không biến nó thành 0. 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ớ.

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 kiểu cast_type. Hàm malloc trả về một con trỏ tới bộ nhớ được phân bổ của byte_size.

Example: ptr = (int *) malloc (50)

Khi câu lệnh này được thực thi thành công, không gian bộ nhớ 50 byte sẽ được dành riêng. Địa chỉ của byte đầu tiên của vùng 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 bộ nhớ có cùng kích thước. Sau khi không gian bộ nhớ được phân bổ, tất cả các byte được khởi tạo về 0. Con trỏ hiện đang ở byte đầu tiên của vùng nhớ được phân bổ sẽ được trả về.

Ví dụ về malloc() trong C

Trong đoạn mã dưới đây, sizeof(*ptr) được sử dụng để phân bổ 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<stdlib.h>
#include<stdio.h>
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ỏ là null thì không gian bộ nhớ sẽ không được phân bổ.

Vòng lặp for được sử dụng để lặp lại giá trị của biến “i” và in tổng. Cuối cùng, hàm free được sử dụng để giải phóng con trỏ.

#include <stdio.h>
#include <stdlib.h>
    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 10 số hạng đầu tiên n Sum = 45

Tại sao nên sử dụng malloc()?

Dưới đây là những lý do sử dụng malloc()

  • Bạn nên sử dụng malloc() khi phải cấp phát bộ nhớ khi chạy.
  • Bạn nên sử dụng malloc khi bạn phải phân bổ các đối tượng phải tồn tại ngoài việc thực thi khối bộ nhớ hiện tại.
  • Sử dụng malloc() nếu bạn cần phân bổ bộ nhớ lớn hơn kích thước của ngăn xếp đó.
  • Nó trả về con trỏ tới byte đầu tiên của không gian được phân bổ.
  • Nó cho phép các nhà phát triển phân bổ bộ nhớ khi cần thiết với số lượng chính xác.
  • Hàm này phân bổ kích thước khối bộ nhớ theo byte từ heap.

Tại sao nên sử dụng calloc()?

Dưới đây là những lý do sử dụng calloc()

  • Khi bạn phải đặt bộ nhớ được phân bổ về 0.
  • Bạn có thể sử dụng calloc trả về một con trỏ để có quyền truy cập vào vùng nhớ.
  • Được sử dụng khi bạn cần khởi tạo các phần tử về 0 để trả về một con trỏ vào bộ nhớ.
  • Để tránh 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ằng 0.