ที่นี่เราจะดูว่าการจัดสรรหน่วยความจำแบบไดนามิกใน C คืออะไร ภาษาการเขียนโปรแกรม C มีฟังก์ชันหลายอย่างสำหรับการจัดสรรและการจัดการหน่วยความจำ ฟังก์ชันเหล่านี้สามารถพบได้ในไฟล์ส่วนหัว
ฟังก์ชัน | คำอธิบาย |
---|---|
void *calloc(int num, int size); | ฟังก์ชันนี้จะจัดสรรอาร์เรย์ของ num องค์ประกอบแต่ละขนาดเป็นไบต์จะมีขนาด |
void free(void *ที่อยู่); | ฟังก์ชันนี้จะเผยแพร่บล็อกของบล็อกหน่วยความจำที่ระบุโดยที่อยู่ |
เป็นโมฆะ *malloc(int num); | ฟังก์ชันนี้จะจัดสรรอาร์เรย์ของ num ไบต์และปล่อยให้ไม่ได้กำหนดค่าเริ่มต้น |
void *realloc(void *ที่อยู่ int newsize); | ฟังก์ชันนี้จะจัดสรรหน่วยความจำใหม่โดยขยายเป็น ขนาดข่าว . |
การจัดสรรหน่วยความจำแบบไดนามิก
ขณะเขียนโปรแกรม หากคุณทราบขนาดของอาร์เรย์ ก็เป็นเรื่องง่ายและคุณสามารถกำหนดเป็นอาร์เรย์ได้ ตัวอย่างเช่น ในการจัดเก็บชื่อของบุคคลใด ๆ ก็สามารถมีอักขระได้สูงสุด 100 ตัว ดังนั้นคุณสามารถกำหนดบางสิ่งดังนี้ −
char name[100];
แต่ตอนนี้ ให้เราพิจารณาสถานการณ์ที่คุณไม่มีความคิดเกี่ยวกับความยาวของข้อความที่คุณต้องการจัดเก็บ ตัวอย่างเช่น คุณต้องการจัดเก็บคำอธิบายโดยละเอียดเกี่ยวกับหัวข้อ ที่นี่เราจำเป็นต้องกำหนดตัวชี้ให้กับตัวละครโดยไม่ต้องกำหนดจำนวนหน่วยความจำที่ต้องการ และหลังจากนั้น เราสามารถจัดสรรหน่วยความจำได้ตามตัวอย่างด้านล่าง -
โค้ดตัวอย่าง
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Adam"); /* allocate memory dynamically */ description = malloc( 200 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Adam a DPS student in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); }
ผลลัพธ์
Name = Zara Ali Description: Zara ali a DPS student in class 10th
โปรแกรมเดียวกันสามารถเขียนได้โดยใช้ calloc(); สิ่งเดียวคือคุณต้องแทนที่ malloc ด้วย calloc ดังนี้ -
calloc(200, sizeof(char));
ดังนั้นคุณจึงสามารถควบคุมได้อย่างสมบูรณ์ และสามารถส่งค่าขนาดใดๆ ก็ได้ในขณะที่จัดสรรหน่วยความจำ ซึ่งแตกต่างจากอาร์เรย์ที่เมื่อกำหนดขนาดแล้ว คุณจะไม่สามารถเปลี่ยนแปลงได้
การปรับขนาดตำแหน่งหน่วยความจำ
เมื่อโปรแกรมของคุณออกมา ระบบปฏิบัติการจะปล่อยหน่วยความจำทั้งหมดที่โปรแกรมของคุณจัดสรรไว้โดยอัตโนมัติ แต่แนวทางปฏิบัติที่ดีเมื่อคุณไม่ต้องการหน่วยความจำอีกต่อไป คุณควรปล่อยหน่วยความจำนั้นโดยการเรียกใช้ฟังก์ชัน free()
อีกทางหนึ่ง คุณสามารถเพิ่มหรือลดขนาดของบล็อกหน่วยความจำที่จัดสรรได้โดยการเรียกใช้ฟังก์ชัน realloc() ให้เราตรวจสอบโปรแกรมข้างต้นอีกครั้งและใช้ประโยชน์จากฟังก์ชั่น realloc() และ free() -
โค้ดตัวอย่าง
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Adam"); /* allocate memory dynamically */ description = malloc( 30 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Adam a DPS student."); } /* suppose you want to store bigger description */ description = realloc( description, 100 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcat( description, "He is in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); /* release memory using free() function */ free(description); }
ผลลัพธ์
Name = Adam Description: Adam a DPS student.He is in class 10th
คุณสามารถลองใช้ตัวอย่างข้างต้นโดยไม่ต้องจัดสรรหน่วยความจำเพิ่มเติมใหม่ และฟังก์ชัน strcat() จะทำให้เกิดข้อผิดพลาดเนื่องจากไม่มีหน่วยความจำในคำอธิบาย