Menu
Coddy logo textTech

בדיקת כישלון בהקצאה

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 34 מתוך 63.

אף ש־malloc() הוא כלי רב־עוצמה להקצאת זיכרון דינמית, יש מציאות קריטית שעליך להבין: malloc() עלול להיכשל. כשהמערכת אוזלת בזיכרון הזמין, malloc() אינו יכול למלא את בקשתך ומחזיר NULL במקום כתובת זיכרון תקפה.

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

int *ptr = (int*)malloc(sizeof(int));

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // צא מהתוכנית או טפל בשגיאה
}

// אפשר להשתמש ב-ptr כאן בבטחה
*ptr = 42;

בדיקת NULL זו אינה אופציונלית — היא חיונית לכתיבת תוכניות C עמידות. גם אם כשלים בהקצאת זיכרון נדירים במערכות מודרניות, הם עלולים להתרחש, במיוחד בסביבות עם משאבים מוגבלים או בעת בקשה להקצאת כמויות גדולות של זיכרון. קוד C מקצועי כולל תמיד את הבדיקות האלה כדי למנוע קריסות ולאפשר טיפול מסודר בשגיאות.

challenge icon

אתגר

קל

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

  1. לקרוא מהמשתמש מספר שלם n שמייצג את מספר המספרים השלמים שיש לאחסן
  2. להשתמש ב־malloc() עם sizeof() כדי להקצות באופן דינמי זיכרון למערך של n מספרים שלמים
  3. לבדוק אם הקצאת הזיכרון הצליחה באמצעות בדיקה אם המצביע שהוחזר הוא NULL
  4. אם ההקצאה נכשלת, להדפיס Memory allocation failed! ולסיים את התוכנית
  5. אם ההקצאה מצליחה, להדפיס Memory allocation successful!
  6. לקרוא מהמשתמש n ערכים של מספרים שלמים ולאחסן אותם במערך שהוקצה
  7. לחשב ולהדפיס את סכום כל הערכים בתבנית: Sum: [value]
  8. להדפיס את סך הבתים שהוקצו בתבנית: Bytes allocated: [value]

זכרו לכלול את הכותרת <stdlib.h> כדי להשתמש ב־malloc(). על התוכנית להדגים את הנוהג החיוני של בדיקת כישלון הקצאה לפני ניסיון להשתמש בזיכרון שהוקצה.

לדוגמה, אם הקלט הוא:

4
10 20 30 40

הפלט שלכם צריך להיות:

Memory allocation successful!
Sum: 100
Bytes allocated: 16

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

נסו בעצמכם

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

int main() {
    // קראו את מספר המספרים השלמים
    int n;
    scanf("%d", &n);
    
    // TODO: כתבו כאן את הקוד שלכם
    // - השתמשו ב-malloc() כדי להקצות זיכרון עבור n מספרים שלמים
    // - בדקו אם הקצאת הזיכרון הצליחה
    // - טפלו הן במקרה של הצלחה והן במקרה של כישלון
    // - קראו את המספרים השלמים ושמרו אותם
    // - חשבו את הסכום ואת מספר הבתים שהוקצו
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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