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.
calloc | trung 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ề. |
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.
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);
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
và địa hạt
, cũng như chức năng phân bổ bộ nhớ miễn phí
:
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.
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.