ทำไมหนังสือ“ The C Programming Language” ถึงบอกว่าฉันต้องโยน malloc?


158

วันนี้ผมมาถึงหน้า167ของภาษา C Programming (ฉบับที่สองไบรอัน W. Kernighan และเดนนิสเอ็ม Ritchie)mallocและพบว่าผู้เขียนบอกว่าผมต้องทิ้ง นี่คือส่วนหนึ่งจากหนังสือ:

7.8.5 การจัดการพื้นที่เก็บข้อมูล

ฟังก์ชัน malloc และ calloc รับบล็อกของหน่วยความจำแบบไดนามิก

void *malloc(size_t n)

ส่งคืนตัวชี้ไปยัง n ไบต์ของที่เก็บข้อมูลที่ไม่กำหนดค่าเริ่มต้นหรือ NULL ถ้าไม่สามารถดำเนินการตามคำขอได้

void *calloc(size_t n, size_t size)

ส่งกลับตัวชี้ไปยังพื้นที่ว่างเพียงพอสำหรับอาร์เรย์ของวัตถุ n ขนาดที่ระบุหรือ NULL ถ้าคำขอไม่สามารถตอบสนอง ที่เก็บข้อมูลถูกเตรียมใช้งานเป็นศูนย์ ตัวชี้ที่ส่งคืนโดย malloc หรือ calloc มีการจัดตำแหน่งที่เหมาะสมสำหรับวัตถุที่เป็นปัญหา แต่ต้องถูกส่งลงในประเภทที่เหมาะสมเช่นเดียวกับใน

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

ผมรู้อยู่แล้วว่าmalloc(และครอบครัว) ผลตอบแทนที่พิมพ์เป็นโมฆะ *และมีคำอธิบายที่ดีทำไมไม่หล่อmalloc

แต่คำถามของฉันคือ: ทำไมหนังสือบอกว่าฉันควรโยนมัน?


125
เพราะหนังสือเก่า
Oliver Charlesworth

12
เพราะแม้แต่ดวงอาทิตย์ก็มีจุดด่างดำมันจะเป็นคำตอบของฉัน กล่าวอีกอย่างหนึ่งว่าหนังสือเล่มนี้ผิด อาจเป็นได้ว่าข้อความมีมาก่อนความหมายสำหรับvoid *และไม่ได้รับการปรับปรุง ดูคำตอบนี้ด้วย
ผ่อนคลาย

8
@Michi หนังสือเล่มนี้มีข้อผิดพลาดทางด้านข้อเท็จจริงและการพิมพ์มากมาย (Google K&R errata) มันเข้ากันได้กับมาตรฐาน C90 เท่านั้นไม่ได้ระบุมาตรฐาน C ปัจจุบันหรือการเปลี่ยนแปลงใด ๆ ในภาษาตั้งแต่ปี 1990 สิ่งที่แย่ที่สุดคือ รูปแบบการเขียนโปรแกรมไม่ดีสไตล์ไม่ดีและรหัสซึ่งอาศัยพฤติกรรมที่ระบุไม่ดี ทั้งหมดที่คุณต้องคลายความเข้าใจถ้าคุณเป็นโปรแกรมเมอร์ C มืออาชีพ
Lundin

8
... และเปรียบเทียบสิ่งนี้กับทำไมคอมไพเลอร์บ่นเมื่อฉันไม่ส่งผลของ malloc หรือไม่ ดังนั้นสำหรับ C - อย่าร่าย สำหรับ C ++ - cast แต่อย่าใช้mallocเพราะไม่ใช่ C ++ - ยกเว้นเมื่อคุณต้อง - แต่คุณไม่ควร - ยกเว้น ... AGGGHHHHHHH !!!!! :-)
Bob Jarvis - Reinstate Monica

2
@Mandrill คุณอ่านคำถามของฉัน? ฉันต้องแก้ไขคำถามให้คุณ
Michi

คำตอบ:


215

จากhttp://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm :

ใน pre-ANSI C - ตามที่อธิบายไว้ใน K & R-1 - malloc () กลับและมันก็จำเป็นที่จะโยนค่าตอบแทนในทุกกรณีที่ตัวแปรที่ได้รับไม่ได้นอกจากนี้ยังมีchar * char *รูปแบบใหม่void *ในมาตรฐาน C ทำให้สิ่งเหล่านี้ไม่จำเป็น

เพื่อช่วยให้ทุกคนรอดพ้นจากความลำบากใจในการกระโจนโดยไม่จำเป็นเพื่อป้องกัน K & R-2 ฉันขอให้เดนนิสริตชี่มีความเห็นว่าฉันสามารถอ้างความถูกต้องของประโยคที่อ้างถึงข้างต้นได้จากหน้า 142 เขาตอบว่า:

ไม่ว่าในกรณีใดตอนนี้ฉันได้อ่านสิ่งที่หน้า 142 ฉันคิดว่ามันผิด มันเขียนในลักษณะที่ไม่เพียง แต่ป้องกันกฎก่อนหน้านี้ แต่แสดงกฎ ANSI ผิดพลาด


23
ดังนั้นประเภทการกลับมาของ malloc เป็นถ่านและไม่เป็นโมฆะ ขอบคุณ.
Michi

10
มันยังกล่าวถึงใน errata web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/…
nos

18
คุณต้องไม่อ่านหนังสือเล่มนี้หากไม่มี errata นั้นพิมพ์บนกระดาษข้างๆคุณ
Lundin

4
@Michi - ไม่มีชนิดกลับเป็นไม่ได้char* charทั้งสองมีความแตกต่างกันอย่างมากมาย
Pete Becker

20
@alk: แน่นอน เมื่ออ่าน K&R คุณกำลังฟังกูรูสองตัวซึ่งเพียงพอ ;-)
Steve Jessop
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.