แนะนำ, 2024

ตัวเลือกของบรรณาธิการ

ความแตกต่างระหว่าง malloc และ calloc

ความแตกต่างพื้นฐานระหว่างฟังก์ชัน malloc และ calloc คือ calloc () ต้องการสองอาร์กิวเมนต์แทนที่จะเป็นหนึ่งอาร์กิวเมนต์ที่ต้องการโดย malloc () ทั้ง malloc () และ calloc () เป็นฟังก์ชั่นที่ภาษาการเขียนโปรแกรม C จัดไว้ให้สำหรับการจัดสรรหน่วยความจำแบบไดนามิกและการจัดสรรเวลา ณ รันไทม์

ก่อนที่จะเข้าใจฟังก์ชัน 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 คือ:

  1. หน่วยความจำที่ต้องการใช้บล็อกเดียวถูกกำหนดใน malloc ในขณะที่หน่วยความจำที่ร้องขอจำนวนมากถูกจัดสรรโดย calloc
  2. ฟังก์ชั่น malloc ไม่ชัดเจนและเริ่มต้นหน่วยความจำที่จัดสรรไว้ มันมีค่าขยะและรายการของหน่วยความจำที่จัดสรรไม่สามารถเปลี่ยนแปลงได้ ในทางตรงกันข้าม calloc เริ่มต้นหน่วยความจำที่จัดสรรให้เป็นศูนย์
  3. malloc นั้นเร็วกว่า calloc เนื่องจากข้อกำหนดของขั้นตอนเพิ่มเติมของการกำหนดค่าเริ่มต้นใน calloc แต่ความแตกต่างนั้นเล็กน้อย
  4. ความแตกต่างระหว่างสองสิ่งนี้คือ calloc คือ malloc + memset, memset จัดสรรฟิสิคัลเพจในหน่วยความจำในขณะที่ malloc กำหนดหน่วยความจำจากฮีพในที่อยู่เสมือนเท่านั้น

สรุป:

ทั้งฟังก์ชั่น malloc และ calloc ใช้สำหรับการจัดสรรหน่วยความจำและมีข้อได้เปรียบบางอย่างและข้อเสียเช่น malloc นั้นรวดเร็วเมื่อเปรียบเทียบกับ calloc ยิ่งกว่านั้น malloc ใช้งานง่ายขึ้นเนื่องจากมีเพียงหนึ่งอาร์กิวเมนต์เท่านั้นเนื่องจาก calloc จัดสรรหน่วยความจำและกำหนดค่าเริ่มต้นพื้นที่หน่วยความจำด้วย ZERO แต่คุณต้องการใช้ calloc เมื่อการ กำหนดค่าเริ่มต้นให้ตัวแปร มีความสำคัญมากกว่าสำหรับคุณ

Top