הקצאה דינמית - malloc()
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 32 מתוך 63.
עכשיו תלמדו על malloc(), הפונקציה העיקרית לבקשת זיכרון מהערימה במהלך הרצת התוכנית. הפונקציה malloc() היא קיצור של "הקצאת זיכרון" ומאפשרת לכם להקצות זיכרון באופן דינמי כשאתם זקוקים לו, במקום להצהיר על משתנים בגודל קבוע בזמן הקומפילציה.
הפונקציה malloc() מקבלת ארגומנט אחד: מספר הבתים שברצונך להקצות. היא מחזירה מצביע void לבלוק הזיכרון שהוקצה, או NULL אם ההקצאה נכשלת. מכיוון שהיא מחזירה מצביע void, אפשר להקצות אותו ישירות למצביע מטיפוס מסוים; המרה (casting) היא אופציונלית ב-C (בניגוד ל-C++, שבה היא נדרשת).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // הקצה זיכרון למספר שלם אחד
// ptr מצביע כעת על מיקום בזיכרון שיכול להכיל מספר שלםהיתרון המרכזי של
malloc()הוא הגמישות — אפשר לבקש בדיוק את כמות הזיכרון הדרושה בזמן הריצה, והזיכרון הזה נשאר זמין עד שמשחררים אותו במפורש. הדבר שימושי במיוחד כשלא יודעים כמה זיכרון יהיה נחוץ עד שהתוכנית פועלת.
זכור לכלול את <stdlib.h> כדי להשתמש ב־malloc(). המרה מפורשת של מצביע ה־void שהוחזר היא אופציונלית ב־C, מכיוון שהוא מומר אוטומטית לסוג שאליו אתה משייך אותו.
אתגר
קלכתוב תוכנית C שמדגימה הקצאת זיכרון דינמית באמצעות malloc() כדי ליצור מספר שלם יחיד בערימה ולעבוד איתו. התוכנית שלך צריכה:
- להשתמש ב-
malloc()כדי להקצות באופן דינמי זיכרון למספר שלם אחד - להמיר את מצביע ה-void שהוחזר למצביע למספר שלם
- לקרוא ערך של מספר שלם מקלט המשתמש
- לאחסן את ערך הקלט בזיכרון שהוקצה באופן דינמי באמצעות אופרטור ביטול ההפניה
- להדפיס את הערך המאוחסן בפורמט:
Stored value: [value] - לחשב את ריבוע הערך ולאחסן אותו באותו מיקום בזיכרון
- להדפיס את הערך בריבוע בפורמט:
Squared value: [value]
זכור לכלול את הכותרת <stdlib.h> כדי להשתמש ב-malloc(). התוכנית שלך צריכה להדגים את תהליך העבודה הבסיסי של הקצאת זיכרון דינמית: בקשת זיכרון מהערימה, שימוש בו לאחסון ולשינוי של נתונים, ועבודה עם הזיכרון שהוקצה באמצעות פעולות על מצביעים.
לדוגמה, אם המשתמש מזין 7, הפלט שלך צריך להיות:
Stored value: 7
Squared value: 49האתגר הזה מציג בפניך את המושג הבסיסי של הקצאת זיכרון דינמית, שבה הזיכרון מתבקש בזמן הריצה במקום להיות קבוע בזמן ההידור, וכך מעניק לתוכניות שלך גמישות רבה יותר בשימוש בזיכרון.
נסו בעצמכם
#include <stdio.h>
#include <stdlib.h>
int main() {
// קרא את הקלט
int input_value;
scanf("%d", &input_value);
// TODO: כתוב את הקוד שלך למטה
// 1. השתמש ב-malloc() כדי להקצות זיכרון למספר שלם אחד
// 2. המר את המצביע המוחזר ל-int*
// 3. אחסן את ערך הקלט בזיכרון שהוקצה
// 4. הדפס את הערך המאוחסן
// 5. חשב את הריבוע ואחסן אותו באותו מקום
// 6. הדפס את הערך בריבוע
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיות6ניהול זיכרון
זיכרון מחסנית לעומת ערימההקצאה דינמית - malloc()שימוש ב-sizeof() להקצאהבדיקת כישלון בהקצאהשחרור זיכרון באמצעות free()הקצאה באמצעות calloc()סיכום: מערך דינמיתרגלו בעצמכם: קומפיילר C אונליין