calloc so với malloc

Khi nào calloc được sử dụng để phân bổ một khối bộ nhớ, vùng được phân bổ được khởi tạo thành số không. Ngược lại, trung tâm thương mại không chạm vào nội dung của khối bộ nhớ được phân bổ, có nghĩa là nó chứa các giá trị rác. Điều này có khả năng có thể là một rủi ro bảo mật vì nội dung của bộ nhớ là không thể đoán trước và lỗi lập trình có thể dẫn đến rò rỉ các nội dung này.

Biểu đồ so sánh

Sự khác biệt - Điểm tương đồng - biểu đồ so sánh calloc so với malloc
calloctrung tâm thương mại
Chức năng phân bổ một vùng bộ nhớ đủ lớn để chứa "n phần tử" của mỗi byte "kích thước". Đồng thời khởi tạo nội dung của bộ nhớ thành số không. cấp phát byte "kích thước" của bộ nhớ.
Số lượng đối số 2 1
Cú pháp void * calloc (number_of_blocks, size_of_each_block_in_bytes); void * malloc (size_in_bytes);
Nội dung của bộ nhớ được phân bổ Vùng được phân bổ được khởi tạo bằng không. Nội dung của bộ nhớ được phân bổ không thay đổi. tức là, bộ nhớ chứa các giá trị không thể đoán trước hoặc rác. Điều này có nguy cơ.
Giá trị trả về con trỏ trống (void *). Nếu việc phân bổ thành công, một con trỏ tới khối bộ nhớ được trả về. Nếu việc cấp phát bộ nhớ không thành công, một con trỏ NULL được trả về. con trỏ trống (void *). Nếu việc phân bổ thành công, một con trỏ tới khối bộ nhớ được trả về. Nếu việc cấp phát bộ nhớ không thành công, một con trỏ NULL được trả về.

Nội dung: calloc so với malloc

  • 1 Cú pháp và Ví dụ
    • 1.1 malloc ()
    • 1,2 calloc ()
  • 2 Video giải thích Calloc, Malloc và Realloc
  • 3 cân nhắc bảo mật
  • 4 Tốc độ thực hiện
  • 5. Tài liệu tham khảo

Cú pháp và ví dụ

malloc ()

void * malloc (kích thước size_t); 

phân bổ kích thước byte bộ nhớ. Nếu phân bổ thành công, một con trỏ tới bộ nhớ được phân bổ sẽ được trả về. Nếu không thì VÔ GIÁ TRỊ Được trả lại. Thí dụ:

/ * Phân bổ bộ nhớ cho một mảng có 15 phần tử loại int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Bộ nhớ không thể được cấp phát, do đó hãy in lỗi và thoát. * / fprintf (stderr, "Không thể phân bổ bộ nhớ \ n"); thoát (EXIT_FAILURE);  / * Phân bổ thành công. * / 

Lưu ý rằng trung tâm thương mại yêu cầu chúng ta tính toán các byte bộ nhớ mà chúng ta cần và chuyển nó làm đối số cho malloc.

calloc ()

void * calloc (size_t nelements, size_t byte); 

cấp phát một khối bộ nhớ liền kề đủ lớn để chứa nelements kích thước byte mỗi. Vùng được phân bổ được khởi tạo bằng không. Trong ví dụ trên:

/ * Phân bổ không gian cho một mảng với 15 phần tử loại int và khởi tạo cho số không. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) / * Bộ nhớ không thể được cấp phát, do đó hãy in lỗi và thoát. * / fprintf (stderr, "Không thể phân bổ bộ nhớ \ n"); thoát (EXIT_FAILURE);  / * Phân bổ thành công. * / 

calloc (m, n) giống như

p = malloc (m * n); bộ nhớ if (p) (p, 0, m * n); 

Video giải thích Calloc, Malloc và Realloc

Hướng dẫn bằng video này giải thích các chức năng cấp phát bộ nhớ trung tâm thương mại, callocđịa hạt, cũng như chức năng phân bổ bộ nhớ miễn phí:

Cân nhắc về Bảo mật

Nó thường là một ý tưởng tốt để sử dụng calloc kết thúc trung tâm thương mại. Khi bạn sử dụng malloc, nội dung của bộ nhớ được phân bổ là không thể đoán trước. Lỗi lập trình có thể khiến các nội dung bộ nhớ này bị rò rỉ theo những cách không lường trước nhưng rất dễ bị tổn thương. Một ví dụ điển hình về rò rỉ như vậy là lỗ hổng Heartbleed trong OpenSSL, cơ chế cơ bản được giải thích trong truyện tranh XKCD này và một số chi tiết kỹ thuật khác có trong bài đăng trên blog này.

Tốc độ thực hiện

calloc chậm hơn một chút so với malloc vì có thêm bước khởi tạo vùng nhớ được phân bổ. Tuy nhiên, trong thực tế, sự khác biệt về tốc độ là rất nhỏ và có thể bỏ qua.

Người giới thiệu

  • calloc trang nam
  • trung tâm thương mại trang nam