วิธีใช้ฟังก์ชัน MALLOC ใน C

How Use Malloc Function C



Malloc เป็นฟังก์ชันในตัวที่ประกาศไว้ในไฟล์ส่วนหัว Malloc เป็นชื่อย่อสำหรับ 'การจัดสรรหน่วยความจำ' และใช้เพื่อจัดสรรหน่วยความจำต่อเนื่องขนาดใหญ่บล็อกเดียวตามขนาดที่ระบุ การจัดสรรหน่วยความจำมีสองประเภทแบบคงที่และแบบไดนามิก การจัดสรรหน่วยความจำแบบคงที่เสร็จสิ้นในเวลารวบรวม และจะไม่เปลี่ยนแปลงขณะใช้งานจริง การจัดสรรหน่วยความจำแบบไดนามิกกำลังจัดสรรหน่วยความจำ ณ รันไทม์สำหรับสิ่งนี้ เราใช้ malloc ตอนนี้ประเด็นคือที่มาของหน่วยความจำนี้ ดังนั้นข้อกำหนดไดนามิกทั้งหมดใน C จึงถูกเติมเต็มจากหน่วยความจำฮีป โดยพื้นฐานแล้ว โปรแกรม/โปรแกรมของเราจะมีหน่วยความจำ 3 แบบ

  • หน่วยความจำสแต็กอยู่ในเครื่องสำหรับทุกวิธี และเมื่อเมธอดกลับมา สแต็คจะล้างข้อมูลโดยอัตโนมัติ
  • พื้นที่หน่วยความจำส่วนกลางจัดสรรหน่วยความจำสำหรับตัวแปรส่วนกลางทั้งหมด พื้นที่หน่วยความจำนี้สร้างขึ้นที่จุดเริ่มต้นของโปรแกรม และในท้ายที่สุด พื้นที่หน่วยความจำจะล้างโดยอัตโนมัติ
  • หน่วยความจำฮีปมักจะเป็นศัตรูกับความต้องการแบบไดนามิกทั้งหมดของโปรแกรม/แอปพลิเคชัน เมื่อใดก็ตามที่เราจะใช้ฟังก์ชัน malloc มันจะยืมหน่วยความจำบางส่วนจากฮีปและให้ตัวชี้ไปที่มัน

ไวยากรณ์:







ไวยากรณ์ของ malloc คือ (void*)malloc(size_t size) ดังนั้นไวยากรณ์บอกว่า malloc ต้องการขนาด มันจะส่งคืนตัวชี้โดยพื้นฐานแล้วตัวชี้เป็นโมฆะและขนาด t ถูกกำหนดเป็นจำนวนเต็มที่ไม่ได้ลงนาม ฟังก์ชัน Malloc จะจัดสรรบล็อกหน่วยความจำตามขนาดที่ระบุในฮีปดังที่คุณเห็นในไวยากรณ์ที่ต้องระบุขนาด และเมื่อสำเร็จ ตัวชี้จะส่งคืนตัวชี้ที่ชี้ไปที่ไบต์แรกของหน่วยความจำที่จัดสรร มิฉะนั้นจะคืนค่า NULL . ดังนั้น งานของ malloc คือการจัดสรรหน่วยความจำตามเวลาทำงาน



ทำไมตัวชี้เป็นโมฆะ:

Malloc ไม่รู้ว่ามันชี้ไปที่อะไร มันหมายความว่าไม่รู้ว่าข้อมูลใดจะเก็บไว้ในตำแหน่งหน่วยความจำนั้น มันเพียงจัดสรรหน่วยความจำที่ผู้ใช้ร้องขอโดยไม่ทราบประเภทของข้อมูลที่จะเก็บไว้ในหน่วยความจำ นั่นเป็นเหตุผลที่มันส่งคืนตัวชี้เป็นโมฆะ



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





ที่นี่ เรากำลังขอให้ malloc จัดสรรหน่วยความจำ 6 ไบต์ในตอนนี้ หาก malloc ที่สำเร็จจะส่งคืนตัวชี้เป็นโมฆะ ในกรณีนั้น เราต้องพิมพ์มันไปยังตัวชี้ประเภทจำนวนเต็ม เพราะเราต้องการเก็บจำนวนเต็มไว้ในหน่วยความจำนั้น ที่นี่ malloc จัดสรรหน่วยความจำ 6 ไบต์ในฮีป และแอดเดรสของไบต์แรกจะถูกเก็บไว้ใน ptr ตัวชี้



ตัวอย่างโปรแกรม:

นี่คือตัวอย่างโปรแกรมง่ายๆ เพื่อให้เข้าใจแนวคิดของ malloc อย่างเหมาะสม

ที่นี่คุณสามารถเห็นได้ด้วยฟังก์ชัน printf ฉันขอให้ผู้ใช้ป้อนจำนวนเต็ม เราได้ประกาศตัวแปรสองตัวที่อยู่เหนือ i และ n ตัวแปร n คือที่ที่เราจะเก็บตัวเลขที่ผู้ใช้ป้อน หลังจากนั้น เรามีฟังก์ชัน malloc เราต้องการให้ malloc จัดสรรขนาดที่เทียบเท่ากับขนาดของจำนวนเต็ม n เรากำลังคูณขนาดถ้า int กับ n; นี่จะให้ขนาดของจำนวนเต็ม n แก่เรา หลังจากนั้น malloc จะส่งคืนตัวชี้เป็นโมฆะ และเรากำลังพิมพ์ไปยังตัวชี้จำนวนเต็ม และเรากำลังจัดเก็บที่อยู่ภายในตัวชี้ ptr การพิมพ์ดีดมีความสำคัญเนื่องจากเป็นแนวปฏิบัติที่ดี

ตอนนี้ หากตัวชี้มีค่า NULL แสดงว่าหน่วยความจำไม่พร้อมใช้งาน ดังนั้นเราจะออกจากโปรแกรมด้วยสถานะความล้มเหลวในการออก หากไม่เป็นเช่นนั้น เราสามารถเรียกใช้ for a loop ได้อย่างง่ายดาย

ลูปจะทำงานจาก 0 ถึง n-1 และเราจะขอให้ผู้ใช้ป้อนจำนวนเต็มทีละตัวทุกครั้ง ภายในฟังก์ชัน scanf มีสิ่งหนึ่งที่เขียน ptr+i เนื่องจากเรารู้ว่า ptr มีที่อยู่ของไบต์แรกของหน่วยความจำ สมมติว่าที่อยู่คือ 1,000 ที่นี่ i เท่ากับศูนย์ในตอนแรก ดังนั้น 1,000+0 คือ 1,000 ดังนั้นภายในที่อยู่นั้นจำนวนเต็มแรกของเราจะถูกเก็บไว้ หลังจากนั้นเมื่อฉันกลายเป็น 1 ดังนั้น 1,000+1 ซึ่งตีความภายในว่า (1000) +1 *4 ถ้าฉันสมมติว่าขนาดของจำนวนเต็มคือ 4 ไบต์ และจะเท่ากับ 1004 ดังนั้นจำนวนเต็มถัดไปจะถูกเก็บไว้ภายใน 1004 ตำแหน่ง และจะดำเนินต่อไปในลักษณะนี้ ที่อยู่เช่น 1000, 1004, 1008 เป็นต้น เราไม่ได้ใช้เครื่องหมายและก่อน ptr+i เพราะ ptr ได้ให้ที่อยู่แก่เราแล้วเมื่อเราเขียน ptr ซึ่งเป็นเพียงตัวชี้ และประกอบด้วยที่อยู่ ไม่ใช่ค่า ดังนั้นจึงไม่จำเป็นต้องใส่เครื่องหมายแอมเพอร์แซนด์ไว้ข้างหน้า และ แนวคิดนี้ควรมีความชัดเจน

ในลูปนี้ เราแค่ทำสิ่งหนึ่งซึ่งเรากำลังพิมพ์จำนวนเต็มทั้งหมดบนหน้าจอ เห็นได้ชัดว่าเรากำลังใช้ ptr+i แต่ในกรณีนี้ เรากำลังยกเลิกการอ้างอิงเนื่องจาก ptr+i แทนที่อยู่ ดังนั้นเราจึงจำเป็นต้องยกเลิกการอ้างอิง ถ้าฉันเท่ากับ 0 มันจะเป็น 1,000 เพราะเราคิดว่าที่อยู่แรกจะเป็น 1,000 ดังนั้นเราจึงยกเลิกการอ้างอิง เราจะได้จำนวนเต็มแรกแล้ว i เท่ากับ 1 และมันจะกลายเป็น 1001 แต่แปลเป็น 1004 ถ้าขนาดของจำนวนเต็มเป็น 4 อีกครั้ง เรากำลังยกเลิกการอ้างอิง ดังนั้นมันจะให้ค่า 2 . แก่เราNSจำนวนเต็ม. ด้วยวิธีนี้ทุกอย่างทำงานได้

ดังนั้น โดยพื้นฐานแล้ว นี่เป็นโปรแกรมง่ายๆ ที่ขอให้ผู้ใช้ป้อนจำนวนเต็ม n จากนั้นเราจะแสดงจำนวนเต็มเหล่านั้นบนหน้าจอ หลังจากรันโปรแกรม จะแสดงขึ้น

ขั้นแรก เรากำลังขอให้ผู้ใช้ป้อนจำนวนเต็ม จากนั้นผู้ใช้ก็ป้อนจำนวนเต็ม และเราเพียงแค่แสดงตัวเลขเหล่านั้นบนหน้าจอ

บทสรุป:

ไม่มีอะไรผิดปกติในโปรแกรมข้างต้นตราบใดที่เราดำเนินการต่อไปเป็นเวลานานมากที่นี่เรากำลังยืมหน่วยความจำจากฮีป แต่เราจะไม่คืนหน่วยความจำกลับคืนสู่ฮีปจะเกิดขึ้นเฉพาะในกรณีที่โปรแกรม / แอปพลิเคชันมี ให้วิ่งได้ยาวนานอย่าง 24 ชม. พวกเขาจะเรียกฟังก์ชัน malloc อีกครั้ง และอีกครั้งซึ่งหมายความว่าทุกครั้งที่พวกเขายืมหน่วยความจำจากฮีปและไม่ส่งคืน นี่เป็นโปรแกรมที่ไม่ดี ดังนั้นเราควรเขียนว่าง (ที่อยู่ของหน่วยความจำที่ควรปล่อย) ก่อนส่งคืน ดังนั้นเมื่อใดก็ตามที่ใช้ malloc ฟรีเป็นสิ่งสำคัญ ดังนั้น เมื่อใช้ malloc เราจึงได้สงวนหน่วยความจำไว้ และ malloc จะจัดสรรหน่วยความจำให้มากที่สุดเท่าที่คุณขอ

มีความสุขในการจัดสรรหน่วยความจำแบบไดนามิก!