PDA

צפייה בגרסה מלאה : מדריך זיכרון דינמי (Dynamic Memory Allocation) בשפת C



Tamir
06-09-2024, 11:11 PM
זיכרון דינמי (Dynamic Memory Allocation) בשפת C


ב-C, אנו יכולים להקצות זיכרון באופן דינמי בזמן ריצה, בניגוד להקצאת זיכרון סטטית בזמן קומפילציה. הדבר מאפשר לתוכנית להשתמש בזיכרון בצורה גמישה ויעילה יותר. הקצאת זיכרון דינמי מתבצעת באמצעות פונקציות כמו `malloc`, `calloc`, ו־`realloc`, ואת הזיכרון המשוחרר באמצעות הפונקציה `free`.


הקצאת זיכרון באמצעות malloc


הפונקציה `malloc` (Memory Allocation) מקצה בלוק של זיכרון בגודל מסוים ומחזירה מצביע לאותו אזור זיכרון. אם ההקצאה נכשלת, היא מחזירה `NULL`. לדוגמה:



c
#include <stdio.h>
#include <stdlib.h>


int main() {
int *ptr;
ptr = (int*) malloc(5 * sizeof(int)); // הקצאת זיכרון ל-5 מספרים שלמים


if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1;
}


// שימוש בזיכרון שהוקצה
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
printf("%d ", ptr[i]);
}


free(ptr); // שחרור הזיכרון שהוקצה
return 0;
}



בקטע הקוד הזה, אנו מקצים זיכרון ל-5 מספרים שלמים בעזרת `malloc` ומשחררים את הזיכרון בסוף באמצעות `free`.


הקצאת זיכרון באמצעות calloc


הפונקציה `calloc` (Contiguous Allocation) מקצה בלוק של זיכרון עבור מספר מוגדר של איברים ומאתחלת את הזיכרון ל-0. לדוגמה:



c
#include <stdio.h>
#include <stdlib.h>


int main() {
int *ptr;
ptr = (int*) calloc(5, sizeof(int)); // הקצאת זיכרון ל-5 מספרים שלמים ואתחולם ל-0


if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1;
}


// שימוש בזיכרון שהוקצה
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]); // הדפסת הערכים המאותחלים
}


free(ptr); // שחרור הזיכרון שהוקצה
return 0;
}



בקטע הקוד הזה, אנו מקצים זיכרון ל-5 מספרים שלמים ומאתחלים כל אחד מהם ל-0 בעזרת `calloc`.


שינוי גודל הזיכרון עם realloc


הפונקציה `realloc` (Reallocation) משמשת לשינוי גודל בלוק זיכרון שהוקצה כבר. אם נרצה להגדיל או להקטין את הזיכרון שהוקצה, נשתמש ב־`realloc`:



c
#include <stdio.h>
#include <stdlib.h>


int main() {
int *ptr;
ptr = (int*) malloc(5 * sizeof(int)); // הקצאת זיכרון ל-5 מספרים שלמים


if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1;
}


// הגדלת הזיכרון ל-10 מספרים שלמים
ptr = (int*) realloc(ptr, 10 * sizeof(int));


if (ptr == NULL) {
printf("Memory reallocation failed\n");
return 1;
}


// שימוש בזיכרון המורחב
for (int i = 0; i < 10; i++) {
ptr[i] = i + 1;
printf("%d ", ptr[i]);
}


free(ptr); // שחרור הזיכרון שהוקצה
return 0;
}



בקטע הקוד הזה, אנו מקצים זיכרון ל-5 מספרים שלמים, ולאחר מכן מגדילים את גודל הבלוק ל-10 מספרים שלמים בעזרת `realloc`.


שחרור זיכרון עם free


כל זיכרון שהוקצה באופן דינמי צריך להשתחרר כאשר אינו נדרש עוד, על מנת למנוע דליפות זיכרון (Memory Leaks). שחרור הזיכרון נעשה בעזרת הפונקציה `free`.



c
free(ptr); // שחרור זיכרון שהוקצה



סיכום


במדריך זה למדנו על הקצאת זיכרון דינמית בשפת C בעזרת `malloc`, `calloc`, ו־`realloc`, ושחרור זיכרון בעזרת `free`. שימוש נכון בהקצאת זיכרון דינמית חשוב לניהול זיכרון יעיל ומניעת דליפות זיכרון.


אם יש לכם שאלות נוספות, אתם מוזמנים לשאול! ?