2010-02-06 57 views
9

Tôi đang theo dõi điều này tutorial (http://theocacao.com/document.page/234). Tôi bối rối về đoạn này, chủ yếu là các dòng liên quan đến calloc:Câu hỏi hướng dẫn C liên quan đến calloc vs malloc

Chúng tôi cũng có thể sử dụng một biến thể của hàm malloc, được gọi là calloc. Hàm calloc nhận hai đối số, một giá trị đếm và kích thước giá trị cơ sở. Nó cũng xóa bộ nhớ trước khi trở về một con trỏ, đó là hữu ích trong việc tránh hành vi không thể đoán trước và đụng độ trong một số trường hợp:

Đó dòng cuối cùng bối rối cho tôi. Có nghĩa là gì để xóa bộ nhớ?

Trả lời

20

Hàm calloc sẽ đảm bảo tất cả byte trong bộ nhớ được trả về được đặt thành 0. malloc không đảm bảo như vậy. Dữ liệu mà nó trả về có thể và sẽ bao gồm dữ liệu dường như ngẫu nhiên.

Sự khác biệt rất hữu ích cho việc khởi tạo thành viên dữ liệu. Nếu 0 là một giá trị mặc định tốt cho tất cả các giá trị trong một cấu trúc thì calloc có thể đơn giản hóa việc tạo cấu trúc.

Foo* pFoo = calloc(1, sizeof(Foo)); 

vs

Foo* pFoo = malloc(sizeof(Foo)); 
pFoo->Value1 = 0; 
pFoo->Value2 = 0; 

kiểm tra null bỏ qua cho rõ ràng.

+0

... với hệ quả là nếu * bạn * không khởi tạo đúng bộ nhớ, bạn sẽ nhận được kết quả không thể đoán trước. – dmckee

+0

Nếu bạn cũng sẽ sử dụng 'realloc()', bạn phải đối phó với thực tế là bộ nhớ thừa không phải là zeroed - vì vậy bạn có thể cần mã khởi tạo của bạn để thực hiện công việc một cách triệt để (đủ). Rõ ràng, nếu bạn 'calloc()' bộ nhớ và sẽ không bao giờ 'realloc()' nó, thì điều này không quan trọng. –

+1

"sẽ, bao gồm dữ liệu dường như ngẫu nhiên" - cho các giá trị nhất định của "ngẫu nhiên".Các bài kiểm tra thống kê có nhiều khả năng sẽ phân biệt nó với các mẫu liên tiếp của một biến ngẫu nhiên rời rạc phân bố đều trong phạm vi 0 ... UCHAR_MAX ;-) –

7

Để được chính xác:

đó là hữu ích trong việc tránh hành vi không thể đoán trước và đụng độ trong một số trường hợp

nên đọc:

đó là hữu ích lẩn trốn khó lường hành vi và sự cố trong một số trường hợp nhất định

4

"Để xóa bộ nhớ" trong trường hợp này có nghĩa là điền vào bằng mẫu bit vật lý không bằng 0. Lưu ý rằng từ quan điểm chính thức, kiểu khởi tạo bộ nhớ thô này chỉ được đảm bảo hoạt động với các kiểu tích phân. I E. đối tượng của các kiểu tích phân được đảm bảo để nhận các giá trị ban đầu bằng không. Cho dù bất kỳ loại nào khác sẽ được khởi tạo một cách có ý nghĩa bởi điều này được định nghĩa thực hiện. (Phải có các tiêu chuẩn bổ sung vượt quá giới hạn của tiêu chuẩn C để đảm bảo thêm. POSIX, IEEE 754, v.v.)

Cho dù sử dụng calloc để "ngăn ngừa sự cố" như được mô tả trong báo giá thực sự có ý nghĩa là một câu hỏi khác . Tôi muốn nói rằng nó thực sự có thể cải thiện tính ổn định của mã được viết bởi các lập trình viên lười biếng theo nghĩa là nó sẽ gấp tất cả các hành vi bất ngờ có thể xảy ra bởi các giá trị rác khác nhau thành một hành vi bất ngờ cụ thể được kích hoạt bởi tất cả các giá trị bằng không.

Các vấn đề liên quan