ก่อนที่จะเข้าใจฟังก์ชัน malloc () และ calloc () ก่อนอื่นให้เราเข้าใจความหมายของการจัดสรรหน่วยความจำแบบไดนามิก การจัดสรรหน่วยความจำเป็น ขั้นตอนการกำหนดหน่วยความจำคอมพิวเตอร์สำหรับการทำงานของโปรแกรมและกระบวนการต่างๆ เราใช้เทคนิคการจัดสรรแบบไดนามิกเมื่อไม่มีใครรู้มาก่อนว่าจำเป็นต้องใช้พื้นที่หน่วยความจำเท่าใดสำหรับโปรแกรมและกระบวนการ
การจัดสรรหน่วยความจำแบบไดนามิกเกิดขึ้นเนื่องจากปัญหาที่เกี่ยวข้องกับการจัดสรรหน่วยความจำแบบสแตติกเช่นหากองค์ประกอบน้อยลงจะถูกเก็บไว้หน่วยความจำที่เหลือจะสูญเปล่าโดยไม่จำเป็น ดังนั้นมันจะเอาชนะปัญหาของการจัดสรรหน่วยความจำแบบสแตติกซึ่งมีการจัดสรรหน่วยความจำเฉพาะเมื่อจำเป็น
แผนภูมิเปรียบเทียบ
พื้นฐานของการเปรียบเทียบ | malloc () | calloc () |
---|---|---|
ไม่มีบล็อก | กำหนดหน่วยความจำที่ต้องการบล็อกเดียว | กำหนดหลาย ๆ บล็อกของหน่วยความจำที่ร้องขอ |
วากยสัมพันธ์ | เป็นโมฆะ * malloc (ขนาด size_t); | เป็นโมฆะ * calloc (size_t NUM ขนาด size_t); |
การเริ่มต้น | malloc () ไม่ชัดเจนและเริ่มต้นหน่วยความจำที่จัดสรรไว้ | หน่วยความจำที่จัดสรรถูกเตรียมใช้งานเป็นศูนย์โดยใช้ calloc () |
มารยาทการจัดสรร | ฟังก์ชัน malloc () จัดสรรหน่วยความจำขนาด 'size' จากฮีป | ฟังก์ชัน calloc () จัดสรรขนาดหน่วยความจำซึ่งเท่ากับขนาด num * |
ความเร็ว | รวดเร็ว | ค่อนข้างช้า |
คำจำกัดความของ malloc ()
ฟังก์ชัน malloc กำหนด บล็อกหน่วยความจำเป็น ไบต์ ผู้ใช้ควรให้ขนาดบล็อกอย่างชัดเจนซึ่งจำเป็นสำหรับการใช้งาน
ผ่านโปรแกรมฟังก์ชั่น malloc ร้องขอ RAM ของระบบสำหรับการจัดสรรหน่วยความจำหากคำขอถูกยอมรับ (นั่นคือฟังก์ชั่น malloc บอกว่าประสบความสำเร็จในการจัดสรรหน่วยความจำ) มันจะส่งกลับตัวชี้ไปยังบล็อกแรกของหน่วยความจำ มันคืนค่าตัวชี้ โมฆะประเภท ซึ่งหมายความว่าสามารถกำหนดประเภทของตัวชี้ใด ๆ
แม้ว่าจะส่งคืน ค่า NULL หากฟังก์ชัน malloc ไม่สามารถจัดสรรจำนวนหน่วยความจำที่ต้องการได้ ฟังก์ชั่น malloc สามารถเข้าถึงได้ใน TURBO C, ไฟล์ส่วนหัว alloc.h
หรือ stdlib.h
และใน UNIX จะสามารถใช้งานได้ในไฟล์ส่วนหัว .
SYNTAX
ไวยากรณ์ของฟังก์ชันนี้เป็นดังนี้:
malloc(number of elements * size of each element);
ตัวอย่างเช่น, int *ptr;
ptr=malloc(10*sizeof (int))
โดยที่ size แสดงขนาดของหน่วยความจำที่ต้องการเป็นไบต์ (เช่นจำนวนตำแหน่งหน่วยความจำต่อเนื่องที่จะจัดสรร)
แต่ดังที่ได้กล่าวมาแล้วว่าฟังก์ชั่น malloc ส่งคืนตัวชี้โมฆะดังนั้นตัวดำเนินการ cast จำเป็นต้องเปลี่ยนชนิดของตัวชี้ที่ส่งคืนตามความต้องการของเราการประกาศข้างต้นสามารถนำเสนอในรูปแบบต่อไปนี้:
ptr_var=(type_cast* ) malloc (size)
โดยที่ ptr_var
เป็นชื่อของตัวชี้ที่เก็บที่อยู่เริ่มต้นของบล็อกหน่วยความจำที่จัดสรรไว้ type_cast
เป็นชนิดข้อมูลที่จะแปลงกลับตัวชี้ (หรือโมฆะประเภท) และขนาดอธิบายขนาดของบล็อกหน่วยความจำที่จัดสรรเป็นไบต์ .
ตัวอย่างเช่น: int *ptr;
ptr=(int*) malloc (10 * size of (int));
หน่วยความจำที่จัดสรรโดยฟังก์ชัน malloc มีค่าขยะ
โปรดทราบว่าเพื่อตรวจสอบว่าหากการร้องขอที่สอดคล้องกันถูกสร้างขึ้นโดย malloc เพื่อจัดสรรหน่วยความจำที่ได้รับจาก RAM ระบบหรือถูกปฏิเสธ (ในกรณีที่พื้นที่ที่ต้องการไม่พร้อมใช้งาน) เราสามารถใช้ประโยชน์จากคุณสมบัติที่ไม่ได้กำหนดจำนวนหน่วยความจำที่ต้องการฟังก์ชัน malloc ส่งคืนค่า NULL
คำจำกัดความของ calloc ()
ฟังก์ชัน calloc ทำงานอย่างแม่นยำเหมือนกับฟังก์ชัน malloc ยกเว้นข้อเท็จจริงที่ว่ามันต้องการอาร์กิวเมนต์สองตัวเช่นเดียวกับในกรณีของ malloc () ต้องการเพียงอาร์กิวเมนต์เดียวเท่านั้น
ตัวอย่างเช่น: int*ptr;
ptr = (int*)calloc(10, 2);
ที่นี่ 2 ระบุขนาดของชนิดข้อมูลในไบต์ที่เราต้องการให้การจัดสรรซึ่งในกรณีนี้คือ 2 สำหรับจำนวนเต็ม และ 10 หมายถึงจำนวนองค์ประกอบที่จะทำการจัดสรร
โปรดจำไว้ว่าอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชัน malloc คือ (n * 10) มันเป็นอาร์กิวเมนต์เดียวที่ไม่ต้องสับสนเพราะมีหลายอาร์กิวเมนต์ที่คั่นด้วยเครื่องหมายจุลภาคเสมอ อาร์กิวเมนต์ (n * 10) ไม่มีเครื่องหมายจุลภาคคั่นระหว่าง ดังนั้นจึงเป็นอาร์กิวเมนต์เดียวแม้ว่าจะไม่ใช่แบบง่าย ๆ แต่เป็นการแสดงออก
กลับไปสู่การประกาศข้างต้นหลังจากการดำเนินการตามคำสั่งด้านบนบล็อกหน่วยความจำ 20 ไบต์จะถูกจัดสรรให้กับโปรแกรมที่ร้องขอและที่อยู่ของบล็อกแรกถูกกำหนดให้กับโปรแกรมที่ร้องขอและที่อยู่ของบล็อกแรกถูกกำหนดให้กับตัวชี้ PTR
หน่วยความจำที่จัดสรรโดยฟังก์ชัน calloc จะถือศูนย์ทั้งหมด ฟังก์ชัน calloc สามารถหาได้ในไฟล์ส่วนหัว หรือ
ใน TURBO C.
ความแตกต่างที่สำคัญระหว่าง malloc และ calloc
ความแตกต่างหลักระหว่างฟังก์ชัน malloc และ calloc คือ:
- หน่วยความจำที่ต้องการใช้บล็อกเดียวถูกกำหนดใน malloc ในขณะที่หน่วยความจำที่ร้องขอจำนวนมากถูกจัดสรรโดย calloc
- ฟังก์ชั่น malloc ไม่ชัดเจนและเริ่มต้นหน่วยความจำที่จัดสรรไว้ มันมีค่าขยะและรายการของหน่วยความจำที่จัดสรรไม่สามารถเปลี่ยนแปลงได้ ในทางตรงกันข้าม calloc เริ่มต้นหน่วยความจำที่จัดสรรให้เป็นศูนย์
- malloc นั้นเร็วกว่า calloc เนื่องจากข้อกำหนดของขั้นตอนเพิ่มเติมของการกำหนดค่าเริ่มต้นใน calloc แต่ความแตกต่างนั้นเล็กน้อย
- ความแตกต่างระหว่างสองสิ่งนี้คือ calloc คือ malloc + memset, memset จัดสรรฟิสิคัลเพจในหน่วยความจำในขณะที่ malloc กำหนดหน่วยความจำจากฮีพในที่อยู่เสมือนเท่านั้น
สรุป:
ทั้งฟังก์ชั่น malloc และ calloc ใช้สำหรับการจัดสรรหน่วยความจำและมีข้อได้เปรียบบางอย่างและข้อเสียเช่น malloc นั้นรวดเร็วเมื่อเปรียบเทียบกับ calloc ยิ่งกว่านั้น malloc ใช้งานง่ายขึ้นเนื่องจากมีเพียงหนึ่งอาร์กิวเมนต์เท่านั้นเนื่องจาก calloc จัดสรรหน่วยความจำและกำหนดค่าเริ่มต้นพื้นที่หน่วยความจำด้วย ZERO แต่คุณต้องการใช้ calloc เมื่อการ กำหนดค่าเริ่มต้นให้ตัวแปร มีความสำคัญมากกว่าสำหรับคุณ