שיעור 22: זיכרון דינמי — Stack, Heap ו-malloc
עד עכשיו כל המשתנים שלנו חיו במחסנית (stack): הם נוצרים אוטומטית, גודלם קבוע מראש, והם נעלמים כשהפונקציה מסתיימת. לפעמים זה לא מספיק — למשל כשרוצים מערך שגודלו ייקבע רק בזמן ריצה. בשביל זה יש את הערימה (heap): מבקשים זיכרון עם malloc(sizeof(int)) מהכותרת stdlib.h, מקבלים כתובת, ובודקים תמיד if (p
המחסנית היא כמו מגש בקפיטריה: מקבלים אותו אוטומטית, והוא נלקח ממך בסוף הארוחה בלי לשאול. הערימה היא כמו מחסן השכרה: את/ה מבקש/ת תא בגודל שתבחר/י (malloc), מקבל/ת מפתח (המצביע), והתא שלך — עד שתחזיר/י את המפתח (free). אם תאבד/י את המפתח בלי להחזיר, התא יישאר תפוס.
- מחסנית (stack)
- אזור זיכרון אוטומטי: משתנים לוקליים נוצרים בו ונעלמים כשהפונקציה מסתיימת. גודלם חייב להיות קבוע מראש.
- ערימה (heap)
- אזור זיכרון שמבקשים ממנו בלוקים בזמן ריצה. מה שביקשת — באחריותך לשחרר עם free.
- malloc(size)
- מבקשת בלוק של size בייטים מהערימה ומחזירה את כתובתו, או NULL אם נכשלה. דורשת #include <stdlib.h>.
- free(p)
- מחזירה את הבלוק שעליו p מצביע אל הערימה. כל malloc צריך free אחד כשמסיימים.
- בדיקת NULL
- מיד אחרי malloc בודקים if (p == NULL) — אם אין מספיק זיכרון פנוי, malloc מחזירה NULL ואסור להשתמש במצביע.