Menu
Coddy logo textTech

הקצאה דינמית - 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, מכיוון שהוא מומר אוטומטית לסוג שאליו אתה משייך אותו.

challenge icon

אתגר

קל

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

  1. להשתמש ב-malloc() כדי להקצות באופן דינמי זיכרון למספר שלם אחד
  2. להמיר את מצביע ה-void שהוחזר למצביע למספר שלם
  3. לקרוא ערך של מספר שלם מקלט המשתמש
  4. לאחסן את ערך הקלט בזיכרון שהוקצה באופן דינמי באמצעות אופרטור ביטול ההפניה
  5. להדפיס את הערך המאוחסן בפורמט: Stored value: [value]
  6. לחשב את ריבוע הערך ולאחסן אותו באותו מיקום בזיכרון
  7. להדפיס את הערך בריבוע בפורמט: 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;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C אונליין