שיעור 23: calloc, realloc ומערכים דינמיים
בשיעור הקודם פגשנו את malloc — שמקצה בלוק אבל משאירה בו זבל. calloc(n, size) עושה צעד נוסף: מקצה וגם מאפסת את כל הבייטים לאפס. realloc(p, new_size) משנה גודל של בלוק קיים — מגדילה או מקטינה — אבל זהירות: היא עלולה להעביר את הבלוק לכתובת חדשה, ולכן תמיד שומרים את התוצאה במצביע זמני: int *tmp = r
realloc היא כמו לעבור לתא אחסון גדול יותר: חברת ההובלות עשויה להעביר את כל החפצים שלך לתא חדש במיקום אחר ולתת לך מפתח חדש. לעולם אל תזרוק/י את המפתח הישן לפני שקיבלת את החדש ביד — אחרת, אם ההובלה נכשלת, איבדת גם את התא הישן.
- calloc(n, size)
- מקצה בלוק עבור n איברים בגודל size כל אחד — וגם מאפסת את כל הבייטים לאפס.
- realloc(p, new_size)
- משנה את גודל הבלוק הקיים. הערכים נשמרים, אבל הבלוק עלול לעבור לכתובת חדשה.
- מצביע זמני (tmp)
- הדפוס הבטוח: int *tmp = realloc(arr, ...); ורק אם tmp אינו NULL — arr = tmp;. כך לא מאבדים את הבלוק המקורי בכישלון.
- קיבולת (capacity)
- כמה איברים הבלוק יכול להכיל. במערך דינמי, כשהקיבולת נגמרת — נהוג להכפיל אותה עם realloc.
- מערך דינמי
- מערך בערימה שגודלו נקבע בזמן ריצה ויכול לגדול לפי הצורך — בניגוד למערך רגיל בגודל קבוע.