עבור לתוכן

בעיה עם העברת פוינטרים ב- C

Featured Replies

פורסם

בניתי שני מבנים כאלה:

typedef struct
{
Node *first;
} List;
typedef struct
{
List words;
} Dictionary;

(Node זה עוד איזשהו מבנה שבניתי).

אבל כשאני שולח אותם לפונקציה פשוטה כמו זו:

void PrintDic(Dictionary *dic)
{
printf("%p\n", dic->words.first);
}

זה מדפיס לי כתובת שונה מהכתובת האמיתית של first (שהגדרתי אותה קודם לכן), כלומר ב- main רשום כתובת שונה ובפונקציה כתובת שונה.

בגלל זה אני לא יכול לגשת לתוכן של first.

אני לא מבין מה אני עושה לא נכון.

מישהו יכול לעזור לי?

פורסם
  • מחבר

אוקיי, הנה כל הקוד.

[attachment deleted by admin]

פורסם

הבעיה שלך היא בפונקציה CreateNewDictionary.

כשאתה מגדיר את המילון ככה: Dictionary d, אז הוא משתנה מקומי שנוצר על המחסנית. כשאתה יוצא מהפונקציה הנוכחית, המשתנה נמחק. למעשה, dic כרגע מצביע לאובייקט שלא קיים יותר (בעגה מקצועית זה נקרא dangling pointer).

כשאתה מתעסק עם מצביעים, אתה חייב להשתמש ב-malloc/free. כלומר:

Dictionary* d = (Dictionary*)malloc(sizeof(Dictionary));

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

שים לב גם שלעשות ככה:

List words;
words.first = NULL;
d.words = words;

זה קצת מיותר - d.words כבר קיים, ואתה יכול ישר לגשת אליו, ולעשות ככה:

d.words.first = NULL

מה שאתה עושה כאן זה למעשה ליצור משתנה מטיפוס List, שם בו ערך מסוים, ואז מעתיק אותו לתוך d.words, כשלמעשה d.words כבר קיים ואתה יכול לכתוב ישר לתוכו.

פורסם
  • מחבר

אה, אוקיי.

תודה רבה על ההסבר והעזרה.

זה מסוג הבעיות שכשעוברים מ- C# ל- C נתקלים בהם.

ארכיון

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

דיונים חדשים