C שימוש ב-malloc למימוש רשימה מקושרת - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

C שימוש ב-malloc למימוש רשימה מקושרת


Dimka

Recommended Posts

שלום,

התוכנה שלי מבוססת על קריאת קובץ טקסט (שורה שורה) ואמורה לשמור מילים מסוימות מהטקסט ולאחר מכן לעבד אותם.

לפי איך שאני רוצה לבנות את זה, כל הנתונים שאצטרך לשמור מהשורה ייכנסו ל-struct אחד שיצביע על הבא אחריו.

אני רוצה להשתמש ב-malloc כדי לשמור ולקשר אותם אחד לשני.

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

אני כמובן לא רוצה אחרי זה להתעסק עם הקצאת מחרוזת ולהצביע עליה (זה יקשה על שחרור הזיכרון בסיום התכנית).

קיצד נכון לעשות את זה?

כרגע ה-struct שלי בנוי כך פחות או יותר:

struct abc
{
char *a;
char *b;
struct abc *next;
}

הכי חשוב לי האפשרות לשמור מילים בתוך ה-struct עם malloc ולשחרר אותם בסיום.

קישור לתוכן
שתף באתרים אחרים

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

אני כמובן לא רוצה אחרי זה להתעסק עם הקצאת מחרוזת ולהצביע עליה (זה יקשה על שחרור הזיכרון בסיום התכנית).

לא כל כך ברור לי מה התכוונת לומר כאן. ב-C אין כזה דבר "מחרוזת" - המילה "מחרוזת" היא קונבנציה, הגדרה שלנו ל"מערך של char שמסתיים ב-'0\'".

קישור לתוכן
שתף באתרים אחרים

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

אשאל אחרת.

נניח אני הקצאתי ל-struct.

אחרי זה הקצאתי למערך תווים כאשר המצביע נמצא בתוך ה-struct.

כאשר אני משחרר את אותו מהזיכרון, האם מערך התווים ישוחרר גם כן?

לדוגמה:

struct abc *words = (struct abc *) malloc(sizeof(struct abc)); //allocate memory for single struct.
words->a = (char *) malloc(sizeof(char)*10); //allocate memory for string.

free(abc);

עריכה: הייתה לי טעות בצורת הכתיבה...

קישור לתוכן
שתף באתרים אחרים

לא, במקרה כזה words->a יישאר לא משוחרר (דהיינו, דליפת זכרון).

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

קישור לתוכן
שתף באתרים אחרים

משהו כזה יעשה את העבודה?

כמובן שבעת הכנסת נתונים, אדאג לאתחל את NEXT ל-null כאשר זה יהיה סוף הרשימה


void cleanup(struct row *list)
{
if (list->next != NULL)
{
cleanup (list->next);
}

/*free internal variables*/
free(list->abc1);
free(list->abc2);
free(list->abc3);
free(list->abc4);

/*free container*/
free (list);
}

קישור לתוכן
שתף באתרים אחרים

משהו כזה, כן. דוגמאות הקוד שלך הן קצת באוויר אז קצת קשה לומר במדויק אם זה נכון או לא.

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...