ที่นี่เราจะดูว่าการจัดสรรหน่วยความจำแบบไดนามิกใน 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() จะทำให้เกิดข้อผิดพลาดเนื่องจากไม่มีหน่วยความจำในคำอธิบาย