בדיקת כישלון בהקצאה
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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 מקצועי כולל תמיד את הבדיקות האלה כדי למנוע קריסות ולאפשר טיפול מסודר בשגיאות.
אתגר
קלכתבו תוכנית C שמדגימה טיפול נכון בשגיאות בעת שימוש ב־malloc() להקצאת זיכרון דינמית. התוכנית צריכה:
- לקרוא מהמשתמש מספר שלם
nשמייצג את מספר המספרים השלמים שיש לאחסן - להשתמש ב־
malloc()עםsizeof()כדי להקצות באופן דינמי זיכרון למערך שלnמספרים שלמים - לבדוק אם הקצאת הזיכרון הצליחה באמצעות בדיקה אם המצביע שהוחזר הוא
NULL - אם ההקצאה נכשלת, להדפיס
Memory allocation failed!ולסיים את התוכנית - אם ההקצאה מצליחה, להדפיס
Memory allocation successful! - לקרוא מהמשתמש
nערכים של מספרים שלמים ולאחסן אותם במערך שהוקצה - לחשב ולהדפיס את סכום כל הערכים בתבנית:
Sum: [value] - להדפיס את סך הבתים שהוקצו בתבנית:
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;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין