שפת C/ניהול זיכרון דינאמי: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
ביטול גרסה 105841 של 94.230.83.144 (שיחה)
אין תקציר עריכה
שורה 466:
שני רצפים נמצאים כעת בזיכרון: אחד מתאים למצביע chars, והשני למצביע אחר py. אפשר להאריך את רצף הזיכרון הנוכחי של chars בתו אחד, אך לא בשניים. הפונקציה realloc תזהה שקיים רצף אחר גדול מספיק, תקצה אותו, תעתיק את שלושת התווים אליו, תשחרר את הרצף הנוכחי, ותחזיר את הכתובת החדשה. לאחר שנשים את הכתובת החדשה בchars, ייראה הזיכרון כך:
[[תמונה:C language realloc after.png|מרכז|100%|הערימה לאחר הקצאות.]]
 
==מעט על מבנים והנדסת תוכנה==
 
 
===הבעיה===
 
ב[[שפת C/ניהול זיכרון דינאמי#שימוש לקליטת והפיכת מספרים|שימוש ברשימה מקושרת לקליטת והפיכת מספרים]] ראינו כיצד להשתמש ברשימה מקושרת כדי לקלוט מספרים ולהדפיסם בסדר הפוך. הפתרון שראינו, למרות נכונותו - בעייתי. קשה לכתוב ולתחזק קוד כזה (ראה גם [[שפת C/פונקציות#מעט על פונקציות והנדסת תוכנה|מעט על פונקציות והנדסת תוכנה]]). בפרט, הקוד שמטפל בקלט ופלט מעורבב בקוד שמנהל את הרשימה המקושרת. לכן:
*קשה לעשות שימוש חוזר (כלומר בתוכנית אחרת) בקוד הרשימה המקושרת
*הקוד מסובך להבנה יחסית למה שהוא עושה
*אם תתגלה שגיאה בקוד, יהיה קשה יותר להבין איזה חלק גרם לה
 
 
 
===כימוס מחסנית===
<source lang = "c">
struct list_
{
link *head;
unsigned long size;
};
 
 
typedef struct list_ list;
 
 
void list_ctor(list *list);
void list_dtor(list *list);
unsigned long list_size(const list *list);
int list_push(list *list, int data);
int list_pop(list *list);
int list_head(const list *list);
</source>
 
 
<source lang = "c">
void list_ctor(list *list)
{
list->head = NULL;
list->size = 0;
}
</source>
 
 
<source lang = "c">
void list_dtor(list *list)
{
link *l = list->head;
while(l != NULL)
{
link *const old = l;
l = old->next;
free(old);
}
list_ctor(list);
}
</source>
 
 
<source lang = "c">
unsigned long list_size(const list *list)
{
return list->size;
}
</source>
 
 
<source lang = "c">
int list_push(list *list, int data)
{
link *const l = (link *)malloc(sizeof(link));
if(l == NULL)
return -1;
l->data = data;
l->next = list->head;
list->head = l;
++list->size;
return 0;
}
</source>
 
<source lang = "c">
int list_pop(list *list)
{
link *const l = list->head;
const int data = l->data;
list->head = l->next;
--list->size;
free(l);
return data;
}
</source>
 
 
<source lang = "c">
int list_head(const list *list)
{
const link *const l = list->head;
return l->data;
}
</source>
 
==מעט על מבנים והנדסת תוכנה==