Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

การจัดสรรหน่วยความจำแบบไดนามิกใน C คืออะไร?


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