Tại sao cuốn sách Ngôn ngữ lập trình C của cuốn sách nói rằng tôi phải chọn malloc?


158

Hôm nay tôi đã đến trang 167 của Ngôn ngữ lập trình C (ấn bản thứ hai Brian W. Kernighan & Dennis M. Ritchie) và thấy rằng tác giả nói rằng tôi phải chọn malloc. Đây là phần trong cuốn sách:

7.8.5 Quản lý lưu trữ

Các hàm malloc và calloc có được các khối bộ nhớ một cách linh hoạt.

void *malloc(size_t n)

trả về một con trỏ tới n byte lưu trữ chưa được khởi tạo hoặc NULL nếu yêu cầu không thể được thỏa mãn.

void *calloc(size_t n, size_t size)

trả về một con trỏ đến đủ không gian trống cho một mảng gồm n đối tượng có kích thước được chỉ định hoặc NULL nếu yêu cầu không thể được thỏa mãn. Bộ lưu trữ được khởi tạo về không. Con trỏ được trả về bởi malloc hoặc calloc có sự căn chỉnh phù hợp cho đối tượng được đề cập, nhưng nó phải được chuyển thành loại thích hợp, như trong

int *ip;
ip = (int *) calloc(n, sizeof(int));

Tôi đã biết rằng malloc(và gia đình của nó) trả về kiểu void * , và có những giải thích tốt tại sao không bỏmalloc .

Nhưng câu hỏi của tôi là: Tại sao cuốn sách nói rằng tôi nên bỏ nó?


125
Vì cuốn sách đã cũ.
Oliver Charlesworth

12
Bởi vì ngay cả Mặt trời cũng có những điểm tối, sẽ là câu trả lời của tôi. Nói cách khác, cuốn sách là sai. Có thể là văn bản có trước ngữ nghĩa void *và không được cập nhật. Xem thêm câu trả lời này .
thư giãn

8
@Michi Cuốn sách có nhiều lỗi thực tế và lỗi đánh máy (google K & R errata), nó chỉ tương thích với tiêu chuẩn C90, nó không đề cập đến tiêu chuẩn C hiện tại cũng như bất kỳ thay đổi nào về ngôn ngữ kể từ năm 1990. Điều tồi tệ nhất là nó chứa đầy thực hành lập trình xấu, phong cách xấu và mã dựa trên hành vi được chỉ định kém. Tất cả những gì bạn phải học nếu bạn trở thành một lập trình viên C chuyên nghiệp.
Lundin

8
... Và tương phản điều này với Tại sao trình biên dịch phàn nàn khi tôi không đưa ra kết quả của malloc? Vì vậy, đối với C - không diễn viên. Đối với C ++ - diễn viên, nhưng không sử dụng mallocvì đó không phải là C ++ - ngoại trừ khi bạn phải - nhưng bạn không nên - ngoại trừ ... AGGGHHHHHH !!!!! :-)
Bob Jarvis - Phục hồi Monica

2
@Mandrill bạn đã đọc Câu hỏi của tôi chưa? Tôi đã phải chỉnh sửa Câu hỏi của tôi cho bạn.
Michi

Câu trả lời:


215

Từ http://computer-programming-forum.com/47-c-lingu/a9c4a586c7dcd3fe.htmlm :

Trong tiền ANSI C - như được mô tả trong K & R-1 - malloc () đã trả về a char * và cần phải bỏ giá trị trả về của nó trong mọi trường hợp trong đó biến nhận cũng không phải là a char *. void *Loại mới trong Tiêu chuẩn C làm cho những mâu thuẫn này không cần thiết.

Để cứu bất kỳ ai khỏi sự bối rối khi nhảy vọt không cần thiết để bảo vệ K & R-2, tôi đã hỏi Dennis Ritchie về ý kiến ​​mà tôi có thể trích dẫn về tính hợp lệ của câu được trích dẫn ở trên từ trang 142. Anh ấy trả lời:

Trong mọi trường hợp, bây giờ tôi đọc lại các công cụ trên p. 142, tôi nghĩ đó là sai; nó được viết theo cách mà nó không chỉ phòng thủ chống lại các quy tắc trước đó, mà nó còn xuyên tạc các quy tắc ANSI.


23
Vì vậy, các kiểu trả về của malloc là char và không trống . Cảm ơn bạn.
Michi


18
Bạn không được đọc cuốn sách này mà không có lỗi in trên giấy bên cạnh bạn.
Lundin

4
@Michi - không, kiểu trả về là char*không char. Hai là rất khác nhau.
Pete Becker

20
@alk: chính xác. Bằng cách đọc K & R, bạn đang nghe hai bậc thầy, điều đó thật phong phú ;-)
Steve Jessop
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.